home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Browsers, Managers & Extensions / Firefox Backup Extension 6.0.3 / chrome / febe.jar / content / febe.js < prev    next >
Text File  |  2008-09-21  |  80KB  |  2,371 lines

  1. // author: Chuck Baker
  2. // contact: febe@customsoftwareconsult.com
  3. // Version 6.0
  4.  
  5.     window.addEventListener("load",febeLoad,true);
  6.  
  7. function febeLoad(){
  8.     febeSetMsgs();
  9.     
  10.   // See if this is a new update/install
  11.     var version = getFebeVersion();
  12.     var newFEBEinstall = new Boolean(false);
  13.     var prefName = "extensions.febe.previousversion";
  14.     if(febePrefs.prefHasUserValue(prefName)){
  15.         var pversion = febePrefs.getCharPref(prefName);
  16.         if (pversion != version){newFEBEinstall = true;}
  17.     }else{
  18.         newFEBEinstall = true;
  19.     }//if
  20.     febePrefs.setCharPref(prefName,version);
  21.  
  22.     if(newFEBEinstall == true){
  23.         // Get a list on installed locales
  24.         var locales = febeLocales();
  25.         var locale = febePrefs.getCharPref("general.useragent.locale");    
  26.         if(locale.length == 2){        // If the locale is only two characters, just guess what it's supposed to be
  27.             switch(locale){
  28.                 case "en":
  29.                     locale = "en-US";
  30.                     break;
  31.                 case "fr":
  32.                     locale = "fr-FR";
  33.                     break;
  34.                 case "es":
  35.                     locale = "es-ES";
  36.                     break;
  37.                 case "pl":
  38.                     locale = "pl-PL";
  39.                     break;
  40.                 case "nl":
  41.                     locale = "nl-NL";
  42.                     break;
  43.                 case "zh":
  44.                     locale = "zh-CN";
  45.                     break;
  46.                 case "de":
  47.                     locale = "de-DE";
  48.                     break;
  49.                 case "ja":
  50.                     locale = "ja-JP";
  51.                     break;
  52.                 case "it":
  53.                     locale = "it-IT";
  54.                     break;
  55.                 case "pt":
  56.                     locale = "pt-BR";
  57.                     break;
  58.                 case "sv":
  59.                     locale = "sv-SE";
  60.                     break;
  61.                 case "sk":
  62.                     locale = "sk-SK";
  63.                     break;
  64.                 case "ru":
  65.                     locale = "ru-RU";
  66.                     break;
  67.  
  68.                 default:
  69.                     locale = "en-US";
  70.                     break;
  71.             }//switch
  72.         }//if        
  73.         if(locales.indexOf(locale) == -1){locale = "en-US";}
  74.         febeWelcomePage = "http://customsoftwareconsult.com/extensions/febe/locale/"+locale+"/FEBEwelcome["+locale+"].html";
  75.         setTimeout("febeWelcomePageDisplay()",1500);    // Let the browser catch up
  76.     }//if
  77.     
  78.     setTimeout('febeRemind()',3000);    // Remind after Fx boots
  79.  
  80.     if(!febeScheduledBuTimer){
  81.         febeScheduledBuTimer = Cc['@mozilla.org/timer;1'].createInstance(Ci.nsITimer);
  82.     }
  83.     febeScheduleBackup();
  84.     window.removeEventListener("load",febeLoad,true);
  85.     return true;
  86. }//febeLoad()
  87.  
  88. function febeLocales(){
  89.   // Return a list of installed locales
  90.  
  91.     // Parse chrome.manifest
  92.     // ex:
  93.     // locale    febe    en-US    jar:chrome/febe.jar!/locale/en-US/
  94.     // locale    febe    bg-BG    jar:chrome/febe.jar!/locale/bg-BG/
  95.     // locale    febe    da-DK    jar:chrome/febe.jar!/locale/da-DK/
  96.  
  97.     var extDir = Cc["@mozilla.org/file/directory_service;1"]
  98.         .getService(Ci.nsIProperties)
  99.         .get("ProfD", Ci.nsIFile);
  100.     
  101.     extDir.append("extensions");
  102.     extDir.append(FEBE_GUID);
  103.     extDir.append("chrome.manifest");
  104.     
  105.     // open an input stream from file
  106.     var istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  107.     istream.init(extDir, 0x01, 0444, 0);
  108.     istream.QueryInterface(Ci.nsILineInputStream);
  109.     
  110.     // read lines into array
  111.     var lArray = [];
  112.     var line = {}, hasmore;
  113.     var str = "jar:chrome/febe.jar!/locale/";
  114.     do {
  115.         hasmore = istream.readLine(line);            // locale    febe    en-US    jar:chrome/febe.jar!/locale/en-US/
  116.         var idx = line.value.indexOf(str);
  117.         if(idx != -1){
  118.             var tmp = line.value.substring(idx);    // jar:chrome/febe.jar!/locale/en-US/
  119.             tmp = tmp.substring(str.length);        // en-US/
  120.             idx = tmp.indexOf("/");
  121.             tmp = tmp.substring(0,idx);                // en-US
  122.             lArray.push(tmp);
  123.         }//if
  124.         
  125.     } while(hasmore);
  126.     istream.close();
  127.     return lArray;
  128. }//febeLocales()
  129.  
  130. function febeWelcomePageDisplay(){
  131.     gBrowser.selectedTab = gBrowser.addTab(febeWelcomePage);
  132. }//febeWelcomePage()
  133.  
  134. function febeRemind(){
  135.   // See if we need to remind about a backup
  136.     if(febeReminded == true){return true;}
  137.     var prefName = "extensions.febe.lastbackup";
  138.     if(!febePrefs.prefHasUserValue(prefName)){return true;}
  139.     var lastBU = Date.parse(febePrefs.getCharPref(prefName));
  140.     var now = Date.parse(Date());
  141.  
  142.     var reminderDays = febePrefs.getIntPref("extensions.febe.reminderdays");
  143.     if(reminderDays > 0){
  144.         var elapsed = (now - lastBU) / (24 * 60 * 60 * 1000);    // Number of days since last backup
  145.         if(elapsed >= reminderDays){
  146.             var tmp = "<style>color: red; font-weight: bold; font-size: 20px;</style>"+febeMsg[171]+"\n";
  147.             tmp += "<style>color: black;</style>"+febeMsg[172].replace("%days%",parseInt(elapsed))+"\n";
  148.             tmp += febeLocalizedDate(lastBU)+"\n\n";
  149.             tmp += "<style>color: black;</style>"+febeMsg[232]+"\n";
  150.             tmp += "<style>color: black; font-weight: bold; font-size: 15px;</style>"+febeMsg[233]+"\n";
  151.             if(febeConfirm(tmp)){febeInit();}
  152.             febeReminded = true;
  153.         }//if
  154.     }
  155.     if(febePrefs.getCharPref("extensions.febe.schedule.frequency") == "none") return;
  156.     var nextBU = Date.parse(febePrefs.getCharPref("extensions.febe.schedule.description"));
  157.     if(nextBU < lastBU){
  158.         var tmp = "<style>color: red; font-weight: bold; font-size: 20px;</style>"+febeMsg[234]+"\n";
  159.         tmp += "<style>color: black;</style>"+febeMsg[235]+"\n";
  160.         tmp += febeLocalizedDate(nextBU)+"\n";
  161.         tmp += "<style>color: black;</style>"+febeMsg[236]+"\n";
  162.         tmp += "<style>color: black; font-weight: bold; font-size: 15px;</style>"+febeMsg[233]+"\n";
  163.         if(febeConfirm(tmp)){febeInit();}
  164.         febeReminded = true;
  165.     }//if
  166.     return true;    
  167. }//febeRemind()
  168.  
  169. function febeGetEnvironmentVariableValue(envString){
  170.     var env = Cc["@mozilla.org/process/environment;1"].createInstance(Ci.nsIEnvironment);
  171.     return env.get(envString);
  172. }//febeGetEnvironmentVariableValue
  173.  
  174. function febeInit(){
  175.   // Get setup and start the backup
  176.   
  177.     // Set chrome priviledges
  178.     netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
  179.     netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
  180.     netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
  181.  
  182.     febeVersion = febeMsg[49]+" "+getFebeVersion();
  183.     febeGetPrefs();
  184.     if(!febeGetBDD()){return false;}
  185.     
  186.     // Create timestamped directory if needed
  187.     if(febeUseTimestampedDir){
  188.         var timestamp = febePrefs.getCharPref("extensions.febe.timestamp.format");
  189.         if(!febeVerifyTimestamp(timestamp)){return false;}
  190.         febeDelTimestampDirs();
  191.         
  192.         var d=new Date();
  193.         var YYYY = String(d.getFullYear());
  194.         var MM = String(d.getMonth()+1);
  195.         if(MM.length == 1){MM = "0" + MM;}
  196.         var DD = String(d.getDate());
  197.         if(DD.length == 1){DD = "0" + DD;}
  198.         var hh = String(d.getHours());
  199.         if(hh.length == 1){hh = "0" + hh;}
  200.         var mm = String(d.getMinutes());
  201.         if(mm.length == 1){mm = "0" + mm;}
  202.         var ss = String(d.getSeconds());
  203.         if(ss.length == 1){ss = "0" + ss;}
  204.         
  205.         timestamp = timestamp.replace("YYYY",YYYY);
  206.         timestamp = timestamp.replace("MM",MM);
  207.         timestamp = timestamp.replace("DD",DD);
  208.         timestamp = timestamp.replace("hh",hh);
  209.         timestamp = timestamp.replace("mm",mm);
  210.         timestamp = timestamp.replace("ss",ss);
  211.         febeBuDesDir.append(timestamp);
  212.         if(!febeBuDesDir.exists() || !febeBuDesDir.isDirectory()){
  213.             febeBuDesDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);
  214.         }//if
  215.         febeExBuDir = febeBuDesDir.path;
  216.     }//if
  217.     
  218.     if(!febeCheckPending()){return false;}
  219.     if(!febeSanityCheck()){return false;}
  220.     if(!febeInitDir()){return false;}
  221.     if(!febeClearDir()){return false;}
  222.     febeStartBackup();
  223.     return true;
  224. }//febeInit()
  225.  
  226. function febeVerifyTimestamp(timestamp){
  227.   // Verify the timestamp mask
  228.     if(timestamp == "FEBE YYYY MM-DD hh.mm.ss"){return true;}    // ISO8601
  229.     if(timestamp == "FEBE YYYY DD.MM hh.mm.ss"){return true;}    // European
  230.     var tmp="<style>color: red; font-weight: bold; font-size: 20px;</style>"+febeMsg[208];
  231.     tmp = tmp.replace("%TIMESTAMP%",timestamp) +"\n\n";
  232.     tmp += febeMsg[209].replace("%FORMAT1%","FEBE YYYY MM-DD hh.mm.ss")+"\n";
  233.     tmp += febeMsg[210].replace("%FORMAT2%","FEBE YYYY DD.MM hh.mm.ss")+"\n\n";
  234.     tmp += "<style>color: red; font-weight: bold; font-size: 20px;</style>"+febeMsg[211];
  235.     febeAlert(tmp);
  236.     return false;
  237. }//febeVerifyTimestamp()
  238.  
  239. function febeVerify(verifyFileName){
  240. //return true
  241.   // Verify backup was created
  242.     if(!febeBuInProgress()){return true;} // Don't verify restores
  243.     if(febeVerifyBackups == false){return true;}
  244.     
  245.     // Check for existance of backup file every second for a maximum of 10 seconds
  246.     for(var i=0; i<5; i++){ 
  247.         var chkFile = febeBuDesDir.clone();
  248.         chkFile.append(verifyFileName);
  249.         if(chkFile.exists()){return true;}
  250.         febePause(1000);
  251.     }//for    
  252.     return false;
  253. }//febeVerify()
  254.  
  255. function febeGetBDD(){
  256.   // See if backup destination directory exists
  257.     var prefName = "extensions.febe.extBUdir";
  258.     if(febePrefs.prefHasUserValue(prefName)){
  259.         febeExBuDir = febeGetUnicharPref(prefName); 
  260.         if(febeExBuDir == ""){
  261.             if(febePlatform == 1){febeExBuDir = "C:\\";}
  262.             if(febePlatform == 2){febeExBuDir = "/";}
  263.             if(febePlatform == 3){febeExBuDir = "/";}
  264.         }//if
  265.         febeBuDesDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  266.         febeBuDesDir.initWithPath(febeExBuDir);
  267.         if (!(febeBuDesDir.exists() && febeBuDesDir.isDirectory())){
  268.             febeAlert(febeMsg[0]+" \""+febeExBuDir+"\" "+febeMsg[1]+"\n"+febeMsg[2]);
  269.             return false;
  270.         }//if
  271.     } else {
  272.         febeAlert(febeMsg[3]+"\n"+febeMsg[4]);
  273.         return false;
  274.     }//if
  275.     return true;
  276. }//febeGetBDD()
  277.  
  278. function febeDelTimestampDirs(){
  279.   // Delete timestamped directories if needed
  280.     if(febeMaxDirs == 0){return true;}    // No limit
  281.     var timestamp = febePrefs.getCharPref("extensions.febe.timestamp.format");
  282.     switch(timestamp){
  283.         case "FEBE YYYY MM-DD hh.mm.ss":
  284.             febeDelISO8601Dirs();
  285.             break;
  286.         case "FEBE YYYY DD.MM hh.mm.ss":
  287.             febeDelEuropeanDirs();
  288.             break;
  289.     }//switch
  290.     return true;
  291. }//function febeDelTimestampDirs(){
  292.  
  293. function febeDelISO8601Dirs(){
  294.   // Delete ISO8601 formated directories 
  295.     var dirArray = [];
  296.     var mask = /^FEBE \d\d\d\d \d\d-\d\d \d\d\.\d\d\.\d\d$/;
  297.     var buDirRoot = febeBuDesDir.clone();
  298.     var entries = buDirRoot.directoryEntries;
  299.     
  300.     while(entries.hasMoreElements()){
  301.         var entry = entries.getNext();
  302.         entry.QueryInterface(Ci.nsIFile);
  303.         var dirName = entry.leafName;
  304.         if(!entry.isDirectory()){continue;}
  305.         if(!dirName.match(mask)){continue;}
  306.         dirArray.push(dirName);
  307.     }
  308.     var numDirsToDelete = dirArray.length - febeMaxDirs + 1;
  309.     dirArray.sort();
  310.     for(var i=0; i<numDirsToDelete; i++){
  311.         var rmDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  312.         rmDir.initWithPath(buDirRoot.path);
  313.         rmDir.append(dirArray[i]);
  314.         rmDir.remove(true);
  315.     }//for
  316.     return true;
  317. }//febeDelTimestampDirs()
  318.  
  319. function febeDelEuropeanDirs(){
  320.   // Delete European formated directories 
  321.     var dirArray = {};
  322.     var sortArray = [];
  323.     var mask = /^FEBE \d\d\d\d \d\d.\d\d \d\d\.\d\d\.\d\d$/;
  324.     var buDirRoot = febeBuDesDir.clone();
  325.     var entries = buDirRoot.directoryEntries;
  326.     
  327.     while(entries.hasMoreElements()){
  328.         var entry = entries.getNext();
  329.         entry.QueryInterface(Ci.nsIFile);
  330.         var dirName = entry.leafName;
  331.         if(!entry.isDirectory()){continue;}
  332.         if(!dirName.match(mask)){continue;}
  333.         var ISO8601 = febeNewDirName(0,dirName);
  334.         sortArray.push(ISO8601);
  335.         dirArray[ISO8601] = dirName;
  336.     }
  337.     sortArray.sort();
  338.     var numDirsToDelete = sortArray.length - febeMaxDirs + 1;
  339.     for(var i=0; i<numDirsToDelete; i++){
  340.         var rmDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  341.         rmDir.initWithPath(buDirRoot.path);
  342.         var which = sortArray[i];
  343.         rmDir.append(dirArray[which]);
  344.         rmDir.remove(true);
  345.     }//for
  346.     return true;
  347. }//febeDelEuropeanDirs()
  348.  
  349. function febeAbortBackup(){
  350.   // Abort scheduled backup before it starts (only if statusbar icon is in "warning" state)
  351.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
  352.     var win = wm.getMostRecentWindow("navigator:browser");
  353.     var d = win.document.getElementById("febestatusbar");
  354.     if(d){
  355.         var status = d.getAttribute("status");
  356.         switch(status){
  357.             case "warning":
  358.                 var tmp="<style>color: red; font-weight: bold; font-size: 20px;</style>"+febeMsg[179];
  359.                 if(!febeConfirm(tmp)){return;}
  360.  
  361.                 for(var i in febeSetTimeoutID){
  362.                     var to = new febeSetTimeoutObj;
  363.                     to.PID = febeSetTimeoutID[i].PID;
  364.                     to.Process = febeSetTimeoutID[i].Process;
  365.                     clearTimeout(to.PID);
  366.                 }//for
  367.                 febeSetTimeoutID = [];
  368.  
  369.                 febeScheduledBuTimer.cancel();
  370.                 var tmp = "<style>color: red; font-weight: bold;</style>"+febeMsg[150]+"\n";
  371.                 tmp += "<style>color: black; font-weight: bold;</style>"+febeMsg[151]+"\n";
  372.                 tmp += "<style>color: black; font-weight: normal;</style>"+febeMsg[152]+"\n";
  373.                 febeAlert(tmp);
  374.                 febePrefs.setBoolPref("extensions.febe.backupInProgress",false);    // In case it tries to start, just say no ...
  375.                 
  376.                 // Turn off scheduled backups 
  377.                 var prefName = "extensions.febe.schedule.frequency";
  378.                 febePrefs.setCharPref(prefName,"none");
  379.                 febeScheduleBackup();
  380.                 break;
  381.             case "normal":
  382.                 var prefName = "extensions.febe.schedule.description";
  383.                 var tmp = "<style>color: blue; font-weight: normal;</style>"+febeMsg[114]+"\n";
  384.                 tmp += "<style>color: black; font-weight: normal;font-family: courier;</style>"+febeGetUnicharPref(prefName);
  385.                 febeAlert(tmp);
  386.                 break;
  387.             case "nobackup": 
  388.                 var tmp = "<style>color: blue; font-weight: normal; font-size: 12px;</style>"+febeMsg[113];
  389.                 febeAlert(tmp);
  390.                 break;
  391.         }//switch
  392.     }//if
  393.     return true;
  394. }//febeAbortBackup()
  395.  
  396. function febeCheckPending(){
  397.   // See if any pending extension/theme installations exist
  398.     var extDir = febeProfDir.clone();
  399.     extDir.append("extensions");
  400.     extDir.append("staged-xpis");
  401.     if(!extDir.exists()){return true;}
  402.     var pending = 0;
  403.     var entries = extDir.directoryEntries;
  404.     while(entries.hasMoreElements()){
  405.         entries.getNext(); 
  406.         pending++;  
  407.     }//while
  408.     var style = "<style>color: red;font-size: 12pt;</style>";
  409.     var tmp = febeMsg[212].replace("%NUM%",pending);
  410.     tmp = style+tmp+"\n\n"+febeMsg[213];
  411.     return febeConfirm(tmp);
  412. }//febeCheckPending()
  413.  
  414. function febeSanityCheck(){
  415.   // Check to see if there is anything to backup
  416.     var OK = (
  417.         buExtensions ||
  418.         buThemes ||
  419.         buBookmarks ||
  420.         buPreferences ||
  421.         buCookies ||
  422.         buUserChrome ||
  423.         buUserPwd ||
  424.         buSearchPlugins ||
  425.         buBrowserHistory ||
  426.         buFormFillHistory ||
  427.         buPermissions ||
  428.         buUDBu ||
  429.         includeFEBE ||
  430.         buProfile);
  431.     if(!OK){febeAlert(febeMsg[131]);}
  432.     return OK;
  433. }//febeSanityCheck()
  434.  
  435. function doFebeBackup(){
  436.     febePrefs.setBoolPref("extensions.febe.backupInProgress",true);    
  437.     if(!buProfile){
  438.         febeBackupExtensions();
  439.         febeBackupBookmarks();
  440.         febeBackupPreferences();
  441.         febeBackupCookies();
  442.         febeBackupUserChrome();
  443.         febeBackupPasswords();
  444.         febeBackupSearchPlugins();
  445.         febeBackupBrowserHistory();
  446.         febeBackupFormFillHistory();
  447.         febeBackupPermissions();
  448.         febeBackupUDBu();
  449.         upBackedUp = false;
  450.     }else{
  451.         febeBackupProfile();
  452.     }
  453.     febeIncludeFEBE();
  454.     febeWriteResults();
  455.     febeStoreBUdate(); 
  456.     try{
  457.         febeWin.close();
  458.     }catch(e){;}
  459.     febePrefs.setBoolPref("extensions.febe.backupInProgress",false);
  460.     febeScheduleBackup();    // Schedule the next backup
  461.     return true;
  462. }//doFebeBackup()
  463.  
  464. function febeStoreBUdate(){
  465.   // Write last backup info to preferences
  466.     var prefName = "extensions.febe.lastbackup";
  467.     var dflt = new Date();
  468.     febeSetUnicharPref(prefName,dflt);
  469.     var prefName = "extensions.febe.lastbackup.folder";
  470.     febeSetUnicharPref(prefName,febeBuDesDir.path);
  471.     return true;
  472. }//febeStoreBUdate()
  473.  
  474. function febeIncludeFEBE(){
  475.   // Include a copy of FEBE with backup
  476.     if(!includeFEBE){return;}
  477.     if(!buProfile){return;}    // Only for full profile backup
  478.     var extDir = febeProfDir.clone();
  479.     extDir.append("extensions");
  480.     extDir.append(FEBE_GUID);
  481.         
  482.     var srcName = extDir.clone();
  483.     srcName = srcName.path;
  484.     var extBuName = "FEBE.xpi";
  485.     
  486.     febeZip(srcName,febeExBuDir,extBuName,false,false);
  487.     
  488.     exBackedUp = true;
  489.     var thisExt = new febeExtInfo(FEBE_GUID);
  490.     if(!thisExt) return false;
  491.     
  492.     var item = new febeExtObj;
  493.     item.Name = "FEBE";
  494.     item.Path = "";
  495.     item.Icon = thisExt.iconURL;
  496.     item.Home = thisExt.homepageURL;
  497.     item.guid = FEBE_GUID;
  498.     item.verified = febeVerify(extBuName);
  499.     febeExtensionsList[item.Name] = item;
  500.     febeExtensionsList["**total**"]++;    
  501.     return true;
  502. }//febeIncludeFEBE()
  503.  
  504. function febeWriteResults(){
  505.   // Create results page    
  506.     febeUpdateProgressWindow(febeMsg[77]);
  507.     
  508.     // Pointer to results page html file
  509.     var febeResultsPage = FEBEdir.clone();
  510.     febeResultsPage.append("FEBEresults.html");
  511.         
  512.   // Open results page for writing
  513.     var resultsFile = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  514.     resultsFile.init(febeResultsPage, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  515.     
  516.   // Get results template
  517.     var resultsTemplate=getFebeResultsTemplate("chrome://febe/content/FEBEresultsTemplate.html")
  518.   
  519.   // Add results to results page
  520.     var middle = new String();
  521.     var cnt = 0;
  522.         
  523.   // Create the new content
  524.     var numExt = parseInt(febeExtensionsList["**total**"]);
  525.     var numThemes = parseInt(febeThemesList["**total**"]);
  526.  
  527.     delete febeExtensionsList["**total**"];
  528.     delete febeThemesList["**total**"];
  529.  
  530.     // Sort using key array
  531.     var febeExtKey = [];
  532.     var febeThemeKey = [];
  533.     for(var i in febeExtensionsList){
  534.         febeExtKey.push(febeExtensionsList[i].Name);
  535.     }//for
  536.  
  537.     for(var i in febeThemesList){
  538.         febeThemeKey.push(febeThemesList[i].Name);
  539.     }//for
  540.     febeExtKey.sort();
  541.     febeThemeKey.sort();
  542.  
  543.     var total = numExt + numThemes;
  544.     if (bmBackedUp){total++};
  545.     if (prBackedUp){total++};
  546.     if (ckBackedUp){total++};
  547.     if (chBackedUp){total++};
  548.     if (ucBackedUp){total++};
  549.     if (pwBackedUp){total++};
  550.     if (pdBackedUp){total++};
  551.     if (spBackedUp){total++};
  552.     if (hsBackedUp){total++};
  553.     if (ffBackedUp){total++};
  554.     if (pmBackedUp){total++};
  555.     if (upBackedUp){total++};
  556.     total += udBackedUp;
  557.  
  558.     var re = new RegExp("\\\\", "g");
  559.     var errCnt = 0;
  560.     var warnCnt = 0;
  561.     var imgstyle = ' height="16" width="16" '
  562.     var table = ['<table border="0" cellpadding="2" cellspacing="2">\n<tbody>',"</tbody>\n</table>"];
  563.     var tr = ["<tr>\n","</tr>\n"];
  564.     var tdnum = ['<td style="vertical-align: middle; text-align: right;"><num>'
  565.             ,"</num></td>\n"];
  566.     var tdimg = ['<td style="text-align: center;">','</td>\n'];
  567.     var tdnolink = ['<td style="font-weight: bold;"><nolink>','</nolink></td>\n'];
  568.     var tdlink = ['<td style="font-weight: bold;">','</td>\n']
  569.     var tdguid = ['<td><guid>','</guid></td>\n'];
  570.     var div = ['<div style="text-align:left; direction: ltr;">\n',"</div>\n"];
  571.     var disabledIndicator = '<img src="chrome://febe/skin/disabled.png"'+imgstyle+'>';
  572.     var useragent = ['<useragent>','</useragent>'];
  573.     middle += febeLocalizedDate(Date())+"<br>\n";
  574.     middle += "<p><b>"+febeMsg[12]+"    </b> "+total+" "+febeMsg[13];
  575.     var prefix = "file://";
  576.     if (febeExBuDir.substring(0,2) == "\\\\"){prefix = "file:///"}    // add extra "\" for networked drive
  577.     middle += "  <i>("+febeMsg[15]+' <a href=\"'+prefix+febeExBuDir.replace(re,"/")+'\">'+febeExBuDir+"</a>)</i></p>\n";
  578.     
  579.     if ((total) != 0){
  580.         if (numExt != 0){
  581.             middle += "<p>"+febeMsg[14]+" ("+numExt+" "+febeMsg[13]+")\n";
  582.             if(febeDisabledCount != 0){
  583.                 middle += "<i>("+febeMsg[107].replace("%num%",febeDisabledCount)+")</i>\n";
  584.             }else{
  585.                 middle += " - "+febeMsg[120].replace("%disabled%",disabledIndicator)+"\n";
  586.             }//if
  587.             middle += "</p>\n"+div[0]+table[0];
  588.             var item = new febeExtObj;
  589.             for(var i=0; i<febeExtKey.length; i++){
  590.                 var key = febeExtKey[i];
  591.                 item = febeExtensionsList[key];
  592.                 if(item.verified == false){
  593.                     febeErrorList.push(febeMsg[18]+" "+item.Name);
  594.                     errCnt++;
  595.                     continue;
  596.                 }//if
  597.                 cnt++;
  598.                 middle += tr[0];
  599.                 middle += tdnum[0]+cnt+"."+tdnum[1];
  600.                 middle += tdimg[0]+"<img src='"+item.Icon+"'"+imgstyle+">"+tdimg[1];
  601.                 var thisExt = new febeExtInfo(item.guid);
  602.                 if(!thisExt) continue;
  603.                 var tmp = item.Name;
  604.                 if(thisExt.isDisabled){
  605.                     tmp = "<i>"+tmp+"</i>";
  606.                 }else{
  607.                     tmp = tmp;
  608.                 }//if
  609.                 if(item.Home != ""){
  610.                     middle += tdlink[0]+"<a href="+item.Home+">"+tmp+"</a>"+tdlink[1];
  611.                 }else{
  612.                     middle += tdnolink[0]+tmp+tdnolink[1];
  613.                 }//if    
  614.                 middle += tr[1];
  615.             }//for
  616.             middle += table[1]+div[1];
  617.         }//if
  618.         
  619.         if (numThemes != 0){
  620.             cnt = 0;
  621.             middle += "<p>"+febeMsg[16]+" ("+numThemes+" "+febeMsg[13]+")</p>\n";
  622.             middle += div[0]+table[0];
  623.             var item = new febeExtObj;
  624.             for(var i=0; i<febeThemeKey.length; i++){
  625.                 var key = febeThemeKey[i];
  626.                 item = febeThemesList[key];
  627.                 if(item.verified == false){
  628.                     febeErrorList.push(febeMsg[18]+" "+item.Name);
  629.                     errCnt++;
  630.                     continue;
  631.                 }//if
  632.                 cnt++;
  633.                 middle += tr[0];
  634.                 middle += tdnum[0]+cnt+"."+tdnum[1];
  635.                 middle += tdimg[0]+"<img src='"+item.Icon+"'"+imgstyle+">"+tdimg[1];
  636.                 var tmp = item.Name;
  637.                 if(item.Home){
  638.                     middle += tdlink[0]+"<a href="+item.Home+">"+tmp+"</a>"+tdlink[1];
  639.                 }else{
  640.                     middle += tdnolink[0]+tmp+tdnolink[1];
  641.                 }//if    
  642.                 middle += tr[1];
  643.             }//for
  644.             middle += table[1]+div[1];
  645.         }//if
  646.         //middle += div[1];
  647.     }else{
  648.         febeErrorList.push("<p>"+febeMsg[19]+"</p>\n");
  649.         errCnt++;
  650.     }//if
  651.     
  652.     middle += "<p>";
  653.     if(!buProfile){
  654.         // Optional backups
  655.         if (buBookmarks){
  656.             if (bmBackedUp){
  657.                 middle +=febeMsg[27]+" <b>"+bmBuName+"</b><br>\n"
  658.             }else{
  659.                 febeErrorList.push(febeMsg[30]);
  660.                 errCnt++;
  661.             }//if
  662.         }//if
  663.         if (buPreferences){
  664.             if (prBackedUp){
  665.                 middle +=febeMsg[28]+" <b>"+prBuName+"</b><br>\n"
  666.             }else{
  667.                 febeWarningList.push(febeMsg[31]);
  668.                 warnCnt++;
  669.             }//if
  670.         }//if
  671.         if (buCookies){
  672.             if (ckBackedUp){
  673.                 middle +=febeMsg[29]+" <b>"+ckBuName+"</b><br>\n"
  674.             }else{
  675.                 febeWarningList.push(febeMsg[32]);
  676.                 warnCnt++;
  677.             }//if    
  678.         }//if    
  679.             if (buUserChrome){
  680.             if (chBackedUp){
  681.                 middle +=febeMsg[52]+" <b>"+chBuName+"</b><br>\n"
  682.             }else{
  683.                 febeWarningList.push(febeMsg[60]);
  684.                 warnCnt++;
  685.             }//if
  686.         }//if    
  687.             if (buUserPwd){
  688.             if (pwBackedUp){
  689.                 middle +=febeMsg[54]+" <b>"+pwBuName+"</b><br>\n"
  690.             }else{
  691.                 febeWarningList.push(febeMsg[62]);
  692.                 warnCnt++;
  693.             }//if    
  694.         }//if
  695.             if (buSearchPlugins){
  696.             if (spBackedUp){
  697.                 middle +=febeMsg[56]+" <b>"+spBuName+"</b><br>\n"
  698.             }else{
  699.                 febeWarningList.push(febeMsg[64]);
  700.                 warnCnt++;
  701.             }//if
  702.         }//if    
  703.             if (buBrowserHistory){
  704.             if (hsBackedUp){
  705.                 middle +=febeMsg[57]+" <b>"+hsBuName+"</b><br>\n"
  706.             }else{
  707.                 febeWarningList.push(febeMsg[65]);
  708.                 warnCnt++;
  709.             }//if
  710.         }//if    
  711.             if (buFormFillHistory){
  712.             if (ffBackedUp){
  713.                 middle +=febeMsg[58]+" <b>"+ffBuName+"</b><br>\n"
  714.             }else{
  715.                 febeWarningList.push(febeMsg[66]);
  716.                 warnCnt++;
  717.             }//if
  718.         }//if    
  719.             if (buPermissions){
  720.             if (pmBackedUp){
  721.                 middle +=febeMsg[116]+" <b>"+pmBuName+"</b><br>\n"
  722.             }else{
  723.                 febeWarningList.push(febeMsg[115]);
  724.                 warnCnt++;
  725.             }//if
  726.         }//if    
  727.         if (buUDBu){
  728.             for(var i in febeUDBuDone){
  729.                 var item = new febeUDBuDoneObj;
  730.                 item.Description = febeUDBuDone[i].Description;
  731.                 item.Name = febeUDBuDone[i].Name;
  732.                 var tmp = febeMsg[148].replace("%description%","\""+item.Description+"\"");
  733.                 tmp = tmp.replace("%name%"," <b>"+item.Name+"</b><br>\n");
  734.                 middle += tmp;
  735.             }//for
  736.         }//if    
  737.     }else{    // Full profile
  738.         if (upBackedUp){
  739.             middle +=febeMsg[59]+" <b>"+upBuName+"</b><br>\n"
  740.         }else{
  741.             febeErrorList.push(febeMsg[67]);
  742.             errCnt++;
  743.         }//if    
  744.     }//if
  745.     middle += "</p>\n";
  746.     
  747.   // Write the final results
  748.     var pageSource = resultsTemplate.replace("%title%", febeMsg[108]);
  749.     pageSource = resultsTemplate.replace("%title%", febeMsg[108]);
  750.     pageSource = pageSource.replace("%reportheading%", febeMsg[109]);
  751.     pageSource = pageSource.replace("%version%", febeVersion);
  752.     pageSource = pageSource.replace("%by%", febeMsg[180]);
  753.     pageSource = pageSource.replace("%results%", middle);
  754.     var prefName = "extensions.febe.orientation";
  755.     var orientation = febePrefs.getCharPref(prefName);
  756.     pageSource = pageSource.replace("%orientation%", orientation);
  757.     middle = "";
  758.     if(errCnt != 0){
  759.         pageSource = pageSource.replace("%errmsg%", "<errh>"+errCnt+" "+febeMsg[112]+"</errh>");
  760.         middle = div[0];
  761.         for(var i=0; i<febeErrorList.length; i++){
  762.             middle += "<err>"+febeErrorList[i]+"</err><br>\n";
  763.         }//for
  764.         middle += div[1];
  765.         pageSource = pageSource.replace("%errlist%", middle);
  766.     }else{
  767.         pageSource = pageSource.replace("%errmsg%<br>", "<!-- %errmsg% -->\n");
  768.         pageSource = pageSource.replace("%errlist%<br>", "<!-- %errlist% -->\n");
  769.     }//if
  770.     if(warnCnt != 0){
  771.         pageSource = pageSource.replace("%warnmsg%", "<warnh>"+warnCnt+" "+febeMsg[132]+"</warnh>");
  772.         middle = div[0];
  773.         for(var i=0; i<febeWarningList.length; i++){
  774.             middle += "<warn>"+febeWarningList[i]+"</warn><br>\n";
  775.         }//for
  776.         middle += div[1];
  777.         pageSource = pageSource.replace("%warnlist%", middle);
  778.     }else{
  779.         pageSource = pageSource.replace("%warnmsg%<br>", "<!-- %warnmsg% -->\n");
  780.         pageSource = pageSource.replace("%warnlist%<br>", "<!-- %warnlist% -->\n");
  781.     }//if
  782.     pageSource = pageSource.replace("%useragent%", useragent[0]+febeMsg[191] + " " + navigator.userAgent+useragent[1]);
  783.     pageSource = pageSource.replace("%hompagemsg%", febeMsg[110]);
  784.     pageSource = pageSource.replace("%linkmsg%", febeMsg[111]);
  785.     
  786.     // Create an UTF-8 output stream
  787.     var charset = "UTF-8";
  788.     var os = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  789.  
  790.     os.init(resultsFile, charset, 4096, 0x0000);
  791.     os.writeString(pageSource);
  792.     os.close();
  793.     
  794.   // Open and display results
  795.     if(errCnt == 0){
  796.         febePlaySound("success");
  797.     }else{
  798.         febePlaySound("failure");
  799.     }//if    
  800.     //var finalPage = "file:///"+febeResultsPage.path;
  801.     var finalPage = "chrome://febe/content/febeResultsLoad.html";
  802.     if(febeDispResults){
  803.         febeOpenLink(finalPage);
  804.     }//if
  805.     if(febeSaveResults){
  806.       // Save results page with backup
  807.         var timestamp = febePrefs.getCharPref("extensions.febe.timestamp.format");
  808.         var d=new Date();
  809.         var YYYY = String(d.getFullYear());
  810.         var MM = String(d.getMonth()+1);
  811.         if(MM.length == 1){MM = "0" + MM;}
  812.         var DD = String(d.getDate());
  813.         if(DD.length == 1){DD = "0" + DD;}
  814.         var hh = String(d.getHours());
  815.         if(hh.length == 1){hh = "0" + hh;}
  816.         var mm = String(d.getMinutes());
  817.         if(mm.length == 1){mm = "0" + mm;}
  818.         var ss = String(d.getSeconds());
  819.         if(ss.length == 1){ss = "0" + ss;}
  820.         
  821.         timestamp = timestamp.replace("YYYY",YYYY);
  822.         timestamp = timestamp.replace("MM",MM);
  823.         timestamp = timestamp.replace("DD",DD);
  824.         timestamp = timestamp.replace("hh",hh);
  825.         timestamp = timestamp.replace("mm",mm);
  826.         timestamp = timestamp.replace("ss",ss);
  827.  
  828.         var dName = febeMsg[76]+" - "+timestamp+".html"; 
  829.         febeCopyFile(febeResultsPage.path,febeBuDesDir.path,dName);
  830.     }//if
  831.     
  832.     // Upload to box.net
  833.     var prefName = "extensions.febe.boxnet.enabled";
  834.     var enabled = febePrefs.getBoolPref(prefName);
  835.     var prefName = "extensions.febe.boxnet.autoupload";
  836.     var upload = febePrefs.getBoolPref(prefName);
  837.     
  838.     if(enabled && upload){
  839.         window.openDialog('chrome://febe/content/BoxNet.html','FEBE upload', 'chrome,alwaysRaised,centerscreen,resizable,minimizable',febeMsg);
  840.     }//if
  841.  
  842.     return true;
  843. }//febeWriteResults()
  844.  
  845. function febeWarn(){
  846.   // Display scheduled backup warning in statusbar
  847.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
  848.     var win = wm.getMostRecentWindow("navigator:browser");
  849.     var d = win.document.getElementById("febestatusbar");
  850.     d.setAttribute("status","warning");
  851.     febePlaySound("warning");
  852.     for(var i=10000; i<= 40000; i += 10000){
  853.         var to = new febeSetTimeoutObj;
  854.         to.PID = setTimeout('febePlaySound("warning")',i)
  855.         to.Process = 'febePlaySound("warning")';
  856.         febeSetTimeoutID.push(to);
  857.     }//for
  858.     return true;
  859. }//febeWarn()
  860.  
  861. function febeDebug(aMsg) {
  862.    setTimeout(function() { throw new Error("[debug] " + aMsg); }, 0);
  863.    return true;
  864. }//debug
  865.  
  866. function febePickFiles(filter,msgNum){
  867.   // Select extension/themes to install
  868.     const nsIFilePicker = Ci.nsIFilePicker;
  869.     var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  870.     fp.init(window, febeMsg[msgNum], nsIFilePicker.modeOpenMultiple);
  871.     fp.appendFilter(filter,filter);
  872.     
  873.     // Set the default directory to the backup destination directory
  874.     var prefName = "extensions.febe.extBUdir";
  875.     if(!febePrefs.prefHasUserValue(prefName)){
  876.         febeGetPrefs();
  877.         if(febePlatform == 1){febeExBuDir = "C:\\";}
  878.         if(febePlatform == 2){febeExBuDir = "/";}
  879.         if(febePlatform == 3){febeExBuDir = "/";}
  880.     }else{
  881.         febeExBuDir = febeGetUnicharPref(prefName);
  882.     }//if
  883.     
  884.     if(febeExBuDir != ""){
  885.         var aDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  886.         aDir.initWithPath(febeExBuDir);
  887.         fp.displayDirectory = aDir;
  888.     }//if
  889.  
  890.     var rv = fp.show();
  891.     febeETinstall = [];
  892.     if (rv == nsIFilePicker.returnOK){
  893.         var files = fp.files;
  894.         while(files.hasMoreElements()) {
  895.             var file = files.getNext()
  896.                 .QueryInterface(Ci.nsILocalFile);
  897.             var obj = new febeExtObj;
  898.             obj.Name = file.leafName;
  899.             obj.Path = file.path;
  900.             febeETinstall.push(obj);
  901.         }//while
  902.     }//if
  903.     return true;
  904. }//febePickFiles()
  905.  
  906. function febeStartBackup(){
  907.     if(febeBuInProgress()){
  908.         if(!febeBuInProgressCheck()) {return false;}
  909.     }//if
  910.  
  911.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
  912.     var win = wm.getMostRecentWindow("navigator:browser");
  913.     
  914.     try{
  915.         if(win.document.getElementById("febeTLBRbutton")){
  916.             win.document.getElementById("febeTLBRbutton").status = "disabled";
  917.             win.document.getElementById("febeTLBRbutton").hidden = "true";
  918.         }//if
  919.         if(!febeHideIcons){
  920.             win.document.getElementById("febestatusbar").hidden = true;
  921.         }//if
  922.     }catch(e){;}
  923.     febePrefs.setBoolPref("extensions.febe.backupInProgress",true);
  924.     if(febeDispProgress == true){
  925.         // Open the progress window
  926.         febeWin = openDialog("chrome://febe/content/febeProgress.xul", "FEBE", "chrome,alwaysRaised,centerscreen,dialog='no'");
  927.         // Give the browser a chance to display the progress window before the backup starts
  928.         setTimeout('doFebeBackup()',1000);
  929.     }else{
  930.         doFebeBackup();
  931.     }//if
  932.     
  933.     try{
  934.         if(win.document.getElementById("febeTLBRbutton")){
  935.             win.document.getElementById("febeTLBRbutton").setAttribute("status","normal");
  936.             win.document.getElementById("febeTLBRbutton").setAttribute("hidden","false");
  937.         }//if
  938.         if(!febeHideIcons){
  939.             win.document.getElementById("febestatusbar").class = "statusbarpanel-iconic febe-normal";
  940.             win.document.getElementById("febestatusbar").hidden = false;
  941.         }//if
  942.     }catch(e){;}
  943.     return true;
  944. }//febeStartBackup()
  945.  
  946. function getFebeResultsTemplate(aURL){
  947.     var req = new XMLHttpRequest();
  948.     req.open('GET', aURL, false);
  949.     req.send(null);
  950.     return req.responseText;
  951. }//getFebeResultsTemplate()
  952.  
  953. function febeDirCopy(sourceDir){
  954. // Recursively copy individual files and sub-directories to a destination directory
  955. // 
  956. // Example:
  957. //    sourceDir (intially) = [profiledir]/extensions
  958. //    febeSubRootDir = {4BBDD651-70CF-4821-84F8-2B918CF89CA3}
  959. //    febeDestDir = nsIFile to [temp]/febe.tmp
  960. //
  961. //        All files and sub-directories in [profiledir]/extensions/{4BBDD651-70CF-4821-84F8-2B918CF89CA3}
  962. //        will be copied to [temp]/febe.tmp/{4BBDD651-70CF-4821-84F8-2B918CF89CA3}
  963.  
  964.     var tmp = "sourceDir: "+sourceDir;
  965.     tmp += "\nfebeSubRootDir: "+febeSubRootDir;
  966.     tmp += "\nfebeDestDir: "+febeDestDir.path;
  967.     var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  968.     if (!aFile) return false;
  969.  
  970.     aFile.initWithPath(sourceDir);
  971.     var entries = aFile.directoryEntries;
  972.     
  973.     while(entries.hasMoreElements()){
  974.         var entry = entries.getNext();
  975.         entry.QueryInterface(Ci.nsIFile);
  976.         var src = entry.path;
  977.         var p = src.indexOf(febeSubRootDir)
  978.         if(p == -1){continue;}
  979.         if(entry.isDirectory()){
  980.             febeDirCopy(src);
  981.         }else{
  982.             var parentPath = entry.parent.path;
  983.             var dest = febeDestDir.path+"\\"+parentPath.substring(p);
  984.             var file = entry.leafName;
  985.             febeCopyFile(src,dest,file);
  986.         }//if
  987.     }//while
  988.     return true;
  989. }//febeDirCopy()
  990.  
  991. function febePickFile(filter,msgNum){
  992.   // Select a file to restore
  993.     const nsIFilePicker = Ci.nsIFilePicker;
  994.     var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  995.     fp.init(window, febeMsg[msgNum], nsIFilePicker.modeOpen);
  996.     
  997.     // Fix for mac - Can't handle strings like "bookmarks*.json". - Change to "*.json"
  998.     if(febePlatform == 3){
  999.         var n = filter.indexOf("*");
  1000.         filter = filter.substr(n);
  1001.     }//if
  1002.     fp.appendFilter(filter,filter);
  1003.     
  1004.     // Set the default directory to the backup destination directory
  1005.     var prefName = "extensions.febe.extBUdir";
  1006.     if(!febePrefs.prefHasUserValue(prefName)){
  1007.         febeGetPrefs();
  1008.         if(febePlatform == 1){febeExBuDir = "C:\\";}
  1009.         if(febePlatform == 2){febeExBuDir = "/";}
  1010.         if(febePlatform == 3){febeExBuDir = "/";}
  1011.     }else{
  1012.         febeExBuDir = febeGetUnicharPref(prefName);
  1013.     }//if
  1014.     if(febeExBuDir != ""){
  1015.         var aDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1016.         aDir.initWithPath(febeExBuDir);
  1017.         fp.displayDirectory = aDir;
  1018.     }//if
  1019.  
  1020.     var rv = fp.show();
  1021.     if (rv == nsIFilePicker.returnOK){
  1022.         rv = fp.file;
  1023.         febePathName = rv.path;
  1024.         febePrName = febePfName = rv.leafName;
  1025.         febePfParent = rv.parent.path;
  1026.         return true;
  1027.     }//if
  1028.     return false;
  1029. }//febePickFile()
  1030.  
  1031. function febeConfirmRestore(msgNum,bDate){
  1032.     var style = "<style>color: red;font-size: 14pt;</style>";
  1033.     var tmp = style+febeMsg[36] +"\n";
  1034.     tmp += febeMsg[msgNum] + "\n";
  1035.     if(bDate != ""){tmp += febeLocalizedDate(bDate) + "\n";}
  1036.     tmp += "\n";
  1037.     if(bDate != ""){tmp += febeMsg[45] + "\n";} 
  1038.     tmp += febeMsg[40];
  1039.     tmp += "\n" + febeMsg[41];
  1040.     return febeConfirm(tmp);
  1041. }//febeConfirmRestore()
  1042.  
  1043. function febeGetBuDate(filename){
  1044.     var oFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1045.     oFile.initWithPath(filename);
  1046.     febeBUdate = new Date(oFile.lastModifiedTime);
  1047.     return true;
  1048. }//febeGetBuDate()
  1049.  
  1050. function febeRestartFx(){
  1051.     // Borrowed from Jed Brown's "Restart Firefox" extension
  1052.     a = Ci.nsIAppStartup,Cc["@mozilla.org/toolkit/app-startup;1"].getService(a).quit(a.eRestart | a.eAttemptQuit);
  1053.     return true;
  1054. }//febeRestartFx()
  1055.  
  1056. function febePause(millis){
  1057.     date = new Date();
  1058.     var curDate = null;
  1059.  
  1060.     do { var curDate = new Date(); }
  1061.         while(curDate-date < millis);
  1062.     return true;
  1063. }//febePause()
  1064.  
  1065. function febeUpdateProgressWindow(pMsg){
  1066.     if(!febeDispProgress) return true;
  1067.     var pMsgField = febeWin.document.getElementById("febeProgressText");
  1068.     if(pMsgField){pMsgField.setAttribute("value",pMsg)};
  1069.     return true;
  1070. }//febeUpdateProgressWindow()
  1071.  
  1072. function febeInitDir(){
  1073.     exBackedUp = false;
  1074.     thBackedUp = false;
  1075.     bmBackedUp = false;
  1076.     prBackedUp = false;
  1077.     ckBackedUp = false;
  1078.     chBackedUp = false;
  1079.     ucBackedUp = false;
  1080.     pwBackedUp = false;
  1081.     pdBackedUp = false;
  1082.     spBackedUp = false;
  1083.     hsBackedUp = false;
  1084.     ffBackedUp = false;
  1085.     pmBackedUp = false;
  1086.     upBackedUp = false;
  1087.     
  1088.     // Get platform
  1089.     febePlatform = febeGetPlatform();
  1090.     
  1091.     // Get pointer to FEBE extension directory
  1092.     FEBEdir = Cc["@mozilla.org/extensions/manager;1"]
  1093.               .getService(Ci.nsIExtensionManager)
  1094.               .getInstallLocation(FEBE_GUID)
  1095.               .getItemLocation(FEBE_GUID);
  1096.     
  1097.     if(febeInitialized == true){return true;}    // Only run the rest of this routine once
  1098.     febeInitialized = true;    
  1099.  
  1100.     // Create pointer to profile directory
  1101.     febeProfDir = Cc["@mozilla.org/file/directory_service;1"]
  1102.         .getService(Ci.nsIProperties)
  1103.         .get("ProfD", Ci.nsIFile);
  1104.     
  1105.     // Get profile name
  1106.     var tmp = "";
  1107.     for (i = febeProfDir.path.length; i > 0; i--){
  1108.         var c = febeProfDir.path.charAt(i);
  1109.         var delimiter = "\\"
  1110.         if(febePlatform == 2){delimiter = "/";}    // *nix
  1111.         if(febePlatform == 3){delimiter = "/";}    // Mac
  1112.         if( c == delimiter ){
  1113.             break;
  1114.         }else{
  1115.             tmp = c + tmp;
  1116.         }
  1117.     }//for
  1118.     var p = tmp.indexOf(".")
  1119.     febeProfName  = tmp.substr(p+1);
  1120.     return true;
  1121. }//febeInitDir()
  1122.  
  1123. function febeClearDir(){
  1124.    // Clear destination directory
  1125.     if(febeClearDestDir == false){return true;}
  1126.     var entries = febeBuDesDir.directoryEntries;
  1127.     var numFiles = 0;
  1128.     var numDirs = 0;
  1129.     while(entries.hasMoreElements()){
  1130.         var entry = entries.getNext();
  1131.         entry.QueryInterface(Ci.nsIFile);
  1132.         if(entry.isFile()){numFiles++;}
  1133.         if(entry.isDirectory()){numDirs++;}
  1134.     }//while
  1135.  
  1136.     // Warn before delete?
  1137.     var clearWarning = new Boolean(false);
  1138.     var prefName = "extensions.febe.clearwarning";
  1139.     if(febePrefs.prefHasUserValue(prefName)){
  1140.         clearWarning = febePrefs.getBoolPref(prefName);
  1141.     } else {
  1142.         febePrefs.setBoolPref(prefName,true);
  1143.         clearWarning = false;
  1144.     }//if
  1145.     
  1146.     if((clearWarning) && numFiles != 0){
  1147.         var promptService = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService);
  1148.         var checkResult = {};
  1149.  
  1150.         var x1 = new RegExp("x1");
  1151.         var x2 = new RegExp("x2");
  1152.         var tmp = febeMsg[99];
  1153.         tmp = tmp.replace(x1,numFiles);
  1154.         tmp = tmp.replace(x2,numDirs);
  1155.         tmp += "\n"+febeMsg[100];
  1156.     
  1157.         var OK = febeConfirm(tmp);
  1158.         if(!OK){return false;}
  1159.     }//if
  1160.     
  1161.     var entries = febeBuDesDir.directoryEntries;
  1162.     while(entries.hasMoreElements()){
  1163.         var entry = entries.getNext();
  1164.         entry.QueryInterface(Ci.nsIFile);
  1165.         if(entry.isFile()){entry.remove(false);}
  1166.     }//while
  1167.     return true;
  1168. }//febeClearDir()
  1169.  
  1170. function febeDosHappy(aString){
  1171.     // Mask out DOS incompatable characters
  1172.     if(febePlatform != 1){return aString;}
  1173.     var goodList = " .@-_";
  1174.     goodList += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  1175.     goodList += "abcdefghijklmnopqrstuvwxyz";
  1176.     goodList += "0123456789";
  1177.     for (var i = 0; i < aString.length; i++){    
  1178.         var c = aString.charAt(i);
  1179.         var OK = new Boolean(false);
  1180.         for (var j = 0; j < goodList.length; j++){
  1181.             var tChar = goodList.charAt(j);
  1182.             //print(c+" : "+tChar+" : "+OK)
  1183.             if(c == tChar){
  1184.                 OK = true;
  1185.                 break;
  1186.             }//if
  1187.         }//for
  1188.         if(OK == false){aString = aString.replace(c,"_");}
  1189.     }//for
  1190.     return aString;
  1191. }//febeDosHappy
  1192.  
  1193. function febeOpenLink(URL){
  1194.     if(!URL){return true;}
  1195.     var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
  1196.     var win = wm.getMostRecentWindow("navigator:browser");
  1197.     var febeGetBrowser = win.getBrowser();
  1198.     var currBlank = (febeGetBrowser &&
  1199.     (febeGetBrowser.mCurrentTab.linkedBrowser &&
  1200.     (febeGetBrowser.mCurrentTab.linkedBrowser.contentDocument.location == "about:blank")) ||
  1201.     (!febeGetBrowser.mCurrentTab.linkedBrowser &&
  1202.     (febeGetBrowser.mCurrentTab.label == "(Untitled)")));
  1203.     if (currBlank)
  1204.         {
  1205.             var resultsWindow = win.loadURI(URL);
  1206.         } else {
  1207.             var resultsWindow = win.openNewTabWith(URL, this.docURL, null, null);
  1208.     }//if
  1209.     return true;
  1210. }febeOpenLink()
  1211.  
  1212. function febeRestoreProgress(){
  1213.     febeGetPrefs();
  1214.     if(febeDispProgress == true){
  1215.         // Open the progress window
  1216.         febeWin = openDialog("chrome://febe/content/febeRestore.xul", "FEBE", "chrome,dependent,alwaysRaised,centerscreen,dialog='no'");
  1217.         febeWin.focus();
  1218.         // Give the browser a chance to display the progress window before the restore starts
  1219.         febePause(1000);
  1220.     }//if
  1221.     return true;
  1222. }//febeRestoreProgress()
  1223.  
  1224. // ------------------ Backup Functions --------------------
  1225.  
  1226. function febeBackupExtensions(){
  1227.   // Backup extensions and themes
  1228.   
  1229.     var extDir = febeProfDir.clone();
  1230.     extDir.append("extensions");
  1231.     var entries = extDir.directoryEntries;
  1232.  
  1233.     febeExtensionsList = {};
  1234.     febeThemesList = {};
  1235.     febeErrorList = [];
  1236.     febeWarningList = [];
  1237.     febeDisabledCount = 0;
  1238.     febeExtensionsList["**total**"] = 0;      // Associative arrays don't have a 
  1239.     febeThemesList["**total**"] = 0;        // 'length' property ... So keep count
  1240.     
  1241.     if(buExtensions == false && buThemes == false){return true;}
  1242.  
  1243.     while(entries.hasMoreElements()){
  1244.         var entry = entries.getNext();
  1245.         entry.QueryInterface(Ci.nsIFile);
  1246.         if(!entry.isDirectory()){continue;}    // Don't process junk in the extension directory
  1247.         extGUID = entry.leafName;
  1248.  
  1249.     // Get info for item
  1250.         var thisExt = new febeExtInfo(extGUID);
  1251.         if(!thisExt) continue;
  1252.         var eType = thisExt.type;                            // 2=Extension, 4=Theme
  1253.         if(eType != 2 && eType != 4){continue;}            // Not an extension or theme ... what is it?
  1254.  
  1255.         if(eType == 2 && buExtensions == false){
  1256.             continue;  // Not backing up extensions at this time
  1257.         }else{
  1258.             exBackedUp = true;
  1259.         }//if
  1260.         if(eType == 4 && buThemes == false){
  1261.             continue;  // Not backing up themes at this time
  1262.         }else{
  1263.             thBackedUp = true;
  1264.         }//if
  1265.  
  1266.         var extIsDisabled = thisExt.isDisabled;
  1267.         if(ignoreDisabled == true){
  1268.             if(extIsDisabled != false){
  1269.                 febeDisabledCount++;
  1270.                 continue;
  1271.             }//if
  1272.         }//if    
  1273.         var extName = thisExt.name;
  1274.         var extVer = febeStripSpaces(thisExt.version);
  1275.         var extIcon = thisExt.iconURL;
  1276.         if(extIsDisabled){extIcon = "chrome://febe/skin/disabled.png";}
  1277.         var extHome = thisExt.homepageURL;
  1278.  
  1279.         febeExtExt = ".xpi";
  1280.         if(eType == 4){febeExtExt = ".jar"};
  1281.         var extBuName = febeStripSpaces(extName)+"{" + extVer + "}"+febeExtExt;
  1282.         var srcName = extDir.clone();
  1283.         srcName.append(extGUID);
  1284.         srcName = srcName.path;
  1285.         
  1286.         febeZip(srcName,febeExBuDir,extBuName,false,false);
  1287.     
  1288.         var item = new febeExtObj;
  1289.         item.Name = extBuName;
  1290.         item.Path = "";
  1291.         item.Icon = extIcon;
  1292.         item.Home = extHome;
  1293.         item.guid = extGUID;
  1294.         item.Type = eType;
  1295.         item.verified = febeVerify(extBuName);
  1296.         
  1297.         if(eType == 2){
  1298.             febeExtensionsList[item.Name] = item;
  1299.             febeExtensionsList["**total**"]++;    
  1300.         }else{
  1301.             febeThemesList[item.Name] = item;
  1302.             febeThemesList["**total**"]++;
  1303.         }//if
  1304.     }//while
  1305.     return true;
  1306. }//febeBackupExtensions() 
  1307.  
  1308. function febeBackupBookmarks(){
  1309.     bmBackedUp = false;
  1310.     if (!buBookmarks){return true;}
  1311.     bmBuName ="bookmarks{" + febeProfName  + "}.json";
  1312.     var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1313.     dFile.initWithPath(febeExBuDir);
  1314.     dFile.append(bmBuName);
  1315.     PlacesUtils.backupBookmarksToFile(dFile);
  1316.     bmBackedUp = febeVerify(bmBuName);
  1317.     return true;
  1318. }//febeBackupBookmarks()
  1319.  
  1320. function febeBackupPreferences(){
  1321.     prBackedUp = false;
  1322.     if (!buPreferences){return true;}
  1323.     var profileDir = febeProfDir.clone();
  1324.     profileDir.append("prefs.js");
  1325.     var srcFile = profileDir.path
  1326.     prBuName ="prefs{" + febeProfName  + "}.js";
  1327.     if (febeCopyFile(srcFile,febeExBuDir,prBuName)){prBackedUp = febeVerify(prBuName);}
  1328.     return true;
  1329. }//febeBackupPreferences()
  1330.  
  1331. function febeBackupCookies(){
  1332.     ckBackedUp = false;
  1333.     if (!buCookies){return true;}
  1334.     ckBuName ="cookies{" + febeProfName  + "}.json";
  1335.     var dFile, fos, cos;
  1336.     var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager);
  1337.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1338.                     
  1339.     dFile = febeBuDesDir.clone();
  1340.     dFile.append(ckBuName);
  1341.     
  1342.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1343.     fos.init(dFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1344.     
  1345.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1346.     cos.init(fos, "UTF-8", 0, 0x0000);
  1347.     
  1348.     var cnt = 0;    
  1349.     var iter = cookieManager.enumerator;
  1350.     while (iter.hasMoreElements()){
  1351.         var cookie = iter.getNext();
  1352.         if (cookie instanceof Ci.nsICookie){
  1353.             var cookieObj = new febeCookieObj(
  1354.                 cookie.expires,
  1355.                 cookie.host,
  1356.                 cookie.isDomain,
  1357.                 cookie.isSecure,
  1358.                 cookie.name,
  1359.                 cookie.path,
  1360.                 cookie.policy,
  1361.                 cookie.status,
  1362.                 cookie.value);
  1363.                 
  1364.             cookieObj.expires = cookie.expires * 1000;  // Convert seconds to milliseconds
  1365.             var jstr = JSON.encode(cookieObj);
  1366.             cos.writeString(jstr+"\n"); 
  1367.             cnt++;
  1368.         }//if
  1369.     }//while
  1370.     cos.close();
  1371.     fos.close();
  1372.     ckBackedUp = febeVerify(ckBuName);
  1373.     return true;
  1374. }//febeBackupCookies()
  1375.  
  1376. function febeBackupUserChrome(){
  1377.     chBackedUp = false;
  1378.     if (!buUserChrome){return true;}
  1379.     var profileDir = febeProfDir.clone();
  1380.     profileDir.append("chrome");
  1381.     if (!profileDir.exists()){return true;}
  1382.     var srcDir = profileDir.path;
  1383.     chBuName ="userChrome{" + febeProfName  + "}.fbu";
  1384.     febeZip(srcDir,febeExBuDir,chBuName,false,false);
  1385.     chBackedUp = febeVerify(chBuName);
  1386.     return true;
  1387. }//febeBackupUserChrome()
  1388.  
  1389. function febeBackupPasswords(){
  1390.     pwBackedUp = false;
  1391.     if (!buUserPwd){return true;}
  1392.     pwBuName = "usernames-passwords{" + febeDosHappy(febeProfName)  + "}.json";
  1393.     
  1394.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1395.     var hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField
  1396.     var loginManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
  1397.     var dFile, fos, cos;
  1398.     
  1399.     dFile = febeBuDesDir.clone();
  1400.     dFile.append(pwBuName)
  1401.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1402.     fos.init(dFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1403.     
  1404.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1405.     cos.init(fos, "UTF-8", 0, 0x0000);
  1406.     
  1407.     var logins = loginManager.getAllLogins({});
  1408.     for (var i = 0; i < logins.length; i++) {
  1409.         login = {};
  1410.         login.hostname = logins[i].hostname;
  1411.         login.formSubmitURL = logins[i].formSubmitURL;
  1412.         login.httpRealm = logins[i].httpRealm;
  1413.         login.username = logins[i].username;
  1414.         login.usernameField = logins[i].usernameField;
  1415.         login.password = febeObfuscate(true,logins[i].password); 
  1416.         login.passwordField = logins[i].passwordField;
  1417.         var jstr = JSON.encode(login);
  1418.         cos.writeString(jstr+"\n"); 
  1419.     }//for
  1420.     
  1421.     cos.close();
  1422.     fos.close();
  1423.     pwBackedUp = febeVerify(pwBuName);
  1424.     return true;
  1425. }//febeBackupPasswords()
  1426.  
  1427. function febeBackupSearchPlugins(){
  1428.     spBackedUp = false;
  1429.     if (!buSearchPlugins){return true;}
  1430.     
  1431.   // See if search plugins exist
  1432.     var profileDir = febeProfDir.clone();
  1433.     profileDir.append("searchplugins");
  1434.     if (!(profileDir.exists() && profileDir.isDirectory())){return true;}
  1435.     spBuName = "searchPlugins{" + febeDosHappy(febeProfName)  + "}.fbu";
  1436.     var srcName = febeProfDir.clone();
  1437.     srcName.append("searchplugins");
  1438.     srcName = srcName.path;
  1439.     febeZip(srcName,febeExBuDir,spBuName,false,false);
  1440.     spBackedUp = febeVerify(spBuName);
  1441.     return true;
  1442. }//febeBackupSearchPlugins()
  1443.  
  1444. function febeBackupBrowserHistory(){
  1445.     hsBackedUp = false;
  1446.     if (!buBrowserHistory){return true;}
  1447.     hsBuName ="history{" + febeProfName  + "}.json";
  1448.     var dFile, fos, cos;
  1449.     var historyService = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsINavHistoryService);
  1450.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1451.                     
  1452.     dFile = febeBuDesDir.clone();
  1453.     dFile.append(hsBuName);
  1454.     
  1455.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1456.     fos.init(dFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1457.     
  1458.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1459.     cos.init(fos, "UTF-8", 0, 0x0000);
  1460.     
  1461.     // Get all history entries
  1462.     var options = historyService.getNewQueryOptions();
  1463.     var query = historyService.getNewQuery();
  1464.     var result = historyService.executeQuery(query, options); 
  1465.  
  1466.     var rr = result.root;
  1467.     rr.containerOpen = true;
  1468.     cnt = 0;
  1469.  
  1470.     for (var i = 0; i < rr.childCount; ++i) {
  1471.         var childNode = rr.getChild(i);
  1472.         var type = childNode.type;
  1473.         if(type != rr.RESULT_TYPE_URI) continue;
  1474.         var obj = {aURI : childNode.uri, aTitle : childNode.title, aLastVisited : childNode.time};
  1475.         var jstr = JSON.encode(obj);
  1476.         cos.writeString(jstr+"\n"); 
  1477.         cnt++;
  1478.     }//for
  1479.     
  1480.     cos.close();
  1481.     fos.close();
  1482.     hsBackedUp = febeVerify(hsBuName);
  1483.     return true;
  1484. }//febeBackupBrowserHistory()
  1485.  
  1486. function febeBackupFormFillHistory(){
  1487.     ffBackedUp = false;
  1488.     if (!buFormFillHistory){return true;}
  1489.     ffBuName ="ffhistory{" + febeProfName  + "}.json";
  1490.     var dFile, fos, cos;
  1491.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1492.                     
  1493.     outFile = febeBuDesDir.clone();
  1494.     outFile.append(ffBuName);
  1495.     var dbFile = febeProfDir.clone();
  1496.     dbFile.append("formhistory.sqlite");
  1497.  
  1498.     var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  1499.     var db = storageService.openDatabase(dbFile);
  1500.  
  1501.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1502.     fos.init(outFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1503.     
  1504.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1505.     cos.init(fos, "UTF-8", 0, 0x0000);
  1506.  
  1507.     var cnt = 0;        
  1508.     var sQuery = "SELECT * FROM moz_formhistory";
  1509.     var stmt = db.createStatement(sQuery);
  1510.     while (stmt.executeStep()) {
  1511.         var obj = {id : stmt.getString(0), fieldname : stmt.getString(1), value : stmt.getString(2)};
  1512.         var jstr = JSON.encode(obj);
  1513.         cos.writeString(jstr+"\n"); 
  1514.         cnt++;
  1515.     }//while
  1516.     cos.close();
  1517.     fos.close();
  1518.     ffBackedUp = febeVerify(ffBuName);
  1519.     return true;
  1520. }//febeBackupFormFillHistory()
  1521.  
  1522. function febeBackupPermissions(){
  1523.     pmBackedUp = false;
  1524.     if (!buPermissions){return true;}
  1525.     pmBuName ="permissions{" + febeProfName  + "}.json";
  1526.     var dFile, fos, cos;
  1527.     var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1528.     
  1529.     outFile = febeBuDesDir.clone();
  1530.     outFile.append(pmBuName);
  1531.     var dbFile = febeProfDir.clone();
  1532.     dbFile.append("permissions.sqlite");
  1533.  
  1534.     var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  1535.     var db = storageService.openDatabase(dbFile);
  1536.  
  1537.     fos = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1538.     fos.init(outFile, 0x02 | 0x08 | 0x20, 0755, 0); // write, create, truncate
  1539.     
  1540.     cos = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
  1541.     cos.init(fos, "UTF-8", 0, 0x0000);
  1542.  
  1543.     var cnt = 0;        
  1544.     var sQuery = "SELECT * FROM moz_hosts";
  1545.     var stmt = db.createStatement(sQuery);
  1546.     while (stmt.executeStep()) {
  1547.         var obj = {id : stmt.getString(0), host : stmt.getString(1), type : stmt.getString(2), permission : stmt.getString(3)};
  1548.         var jstr = JSON.encode(obj);
  1549.         cos.writeString(jstr+"\n"); 
  1550.         cnt++;
  1551.     }//while
  1552.     cos.close();
  1553.     fos.close();
  1554.     pmBackedUp = febeVerify(pmBuName);
  1555.     return true;
  1556. }//febeBackupPermissions()
  1557.  
  1558. function febeBackupUDBu(){
  1559.     if (!buUDBu){return true;}
  1560.     udBackedUp = 0;
  1561.     febeUDBuDone = [];
  1562.     if(!febeUDBuInit()){return false;}    // UDBU is empty
  1563.     for(var i in febeUDBuList){
  1564.         var Label = new String(febeUDBuList[i].Label);
  1565.         if(Label.length == 0){continue;}    // Datafile is empty?
  1566.         var Type = new Number(febeUDBuList[i].Type);
  1567.         var Description = new String(febeUDBuList[i].Description);
  1568.         var Path = new String(febeUDBuList[i].Path);
  1569.         var Include = new Boolean(false);
  1570.         Include = febeUDBuList[i].Include;
  1571.         var item = new febeUDBuDoneObj;
  1572.         item.Description = Description;
  1573.         item.Type = Type;    // Not really needed ... just for completeness    
  1574.         if(Include == "false"){continue;}
  1575.         if(Type == 1){    // Folder
  1576.             udBuName = Label+"{" + febeDosHappy(febeProfName)  + "}.fbu";
  1577.             var srcName = Path;
  1578.             item.Name = udBuName;
  1579.             febeZip(srcName,febeExBuDir,udBuName,true,false);
  1580.             
  1581.             if(febeVerify(udBuName)){        
  1582.                 udBackedUp++;
  1583.             }else{
  1584.                 item.Description = "*** Error backing up "+Description;
  1585.             }//if
  1586.  
  1587.             febeUDBuDone[Label] = item;
  1588.             
  1589.         }else{        // File
  1590.             var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1591.             file.initWithPath(Path);
  1592.             var UDBuName = Label+"{"+febeProfName+"}-"+file.leafName;
  1593.             item.Name = UDBuName;
  1594.             
  1595.             if(file.exists()){
  1596.                 febeCopyFile(Path,febeExBuDir,UDBuName);    
  1597.             }else{
  1598.                 var style = "<style>color: red;font-size: 12pt;</style>";
  1599.                 var tmp = style+febeMsg[166].replace("%path%",Path)+"\n"
  1600.                 febeAlert(tmp);
  1601.             }//if
  1602.             
  1603.             if(febeVerify(UDBuName)){        
  1604.                 udBackedUp++;
  1605.             }else{
  1606.                 item.Description = febeMsg[167].replace("%description%",Description);
  1607.             }//if
  1608.             febeUDBuDone[Label] = item;
  1609.         }//if
  1610.     }//for    
  1611.     return true;
  1612. }//febeBackupUDbu()
  1613.  
  1614. function febeBackupProfile(){
  1615.     upBackedUp = false;
  1616.     febeExtensionsList = [];
  1617.     febeThemesList = [];
  1618.     febeExtensionsList["**total**"] = 0;      // Associative arrays don't have a 
  1619.     febeThemesList["**total**"] = 0;        // 'length' property ... So keep count
  1620.     if (!buProfile){return true;}
  1621.     upBuName = "profileFx3{" + febeProfName  + "}.fbu"; 
  1622.     var srcName = febeProfDir.clone();
  1623.     srcName = srcName.path;
  1624.     febeZip(srcName,febeExBuDir,upBuName,false,false);
  1625.     upBackedUp = febeVerify(upBuName);
  1626.     return true;
  1627. }//febeBackupProfile()
  1628.  
  1629. // ------------------ End of Backup Functions -------------
  1630.  
  1631. // ------------------ Restore Functions -------------------
  1632.  
  1633. function febeRestoreExtensions(){
  1634.     if(!febeInitDir()){return false;}
  1635.     febePickFiles("*.xpi",25);
  1636.     
  1637.     var xpi = new Array();
  1638.     for (var i = 0; i < febeETinstall.length; i++){    
  1639.         var tmp = "file:///" + febeETinstall[i].Path;
  1640.         var name = febeETinstall[i].Name;
  1641.         xpi[name]=tmp;    
  1642.     }//for
  1643.     InstallTrigger.install(xpi);
  1644.     return true;
  1645. }//febeRestoreExtensions()
  1646.  
  1647. function febeRestoreThemes(){
  1648.     if(!febeInitDir()){return false;}
  1649.     febePickFiles("*.jar",24);
  1650.     
  1651.     var jar = new Array();
  1652.     for (var i = 0; i < febeETinstall.length; i++){    
  1653.         var tmp = "file:///" + febeETinstall[i].Path;
  1654.         var name = febeETinstall[i].Name;
  1655.         jar[name]=tmp;    
  1656.     }//for
  1657.     InstallTrigger.install(jar);
  1658.     return true;
  1659. }//febeRestoreThemes()
  1660.  
  1661. function febeRestoreBookmarks(){
  1662.     if(!febeInitDir()){return false;}
  1663.     febePathName = ""
  1664.     if(!febePickFile("bookmarks*.json",33)){return true};
  1665.     var check1 = febePrName.indexOf("bookmarks{");
  1666.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  1667.     if(check1 != 0 || check2 != 6){
  1668.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[50].replace("%FILE%","'"+febePrName+"'")+"\n";
  1669.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  1670.         febeAlert(tmp);
  1671.         return false;
  1672.     }//if
  1673.     
  1674.     febeGetBuDate(febePathName);
  1675.     if(febeConfirmRestore(37,febeBUdate)){
  1676.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1677.         dFile.initWithPath(febePathName);
  1678.         PlacesUtils.restoreBookmarksFromJSONFile(dFile);
  1679.         febeAlert(febeMsg[42]);
  1680.     }else{
  1681.         febeAlert(febeMsg[46]);
  1682.     }
  1683.     return true;
  1684. }//febeRestoreBookmarks()
  1685.  
  1686. function febeRestorePreferences(){
  1687.     if(!febeInitDir()){return false;}
  1688.     febePathName = ""
  1689.     if(!febePickFile("prefs*.js",34)){return true};
  1690.     var check1 = febePrName.indexOf("prefs{");
  1691.     var check2 = febePrName.length - febePrName.lastIndexOf("}.js");
  1692.     if(check1 != 0 || check2 != 4){
  1693.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[69].replace("%FILE%","'"+febePrName+"'")+"\n";
  1694.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  1695.         febeAlert(tmp);
  1696.         return false;
  1697.     }//if
  1698.  
  1699.     febeGetBuDate(febePathName);
  1700.     if(febeConfirmRestore(38,febeBUdate)){
  1701.         
  1702.         // Pointer to preferences
  1703.         var oldPrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
  1704.         
  1705.         // Pointer to new (restored) preferences
  1706.         var newPrefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
  1707.                     
  1708.         // Pointer to backed up preferences file
  1709.         var newPrefFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1710.         
  1711.         // Get pointer to "Prefs.js"
  1712.         var PrefsFile = febeProfDir.clone();
  1713.                    
  1714.         PrefsFile.append("prefs.js")
  1715.         newPrefFile.initWithPath(febePathName);     // Initialize backed up prefs file
  1716.         oldPrefs.deleteBranch("");                    // Delete old preferences
  1717.         newPrefs.readUserPrefs(newPrefFile);        // Read in backed up preferences
  1718.         newPrefs.savePrefFile(PrefsFile);            // Save the restored preferences file
  1719.         febeAlert(febeMsg[43]);
  1720.         febeRestartFx();                            // Restart Firefox
  1721.     }else{
  1722.         febeAlert(febeMsg[46]);
  1723.     }
  1724.     return true;
  1725. }//febeRestorePreferences()
  1726.  
  1727. function febeRestoreCookies(){
  1728.     if(!febeInitDir()){return false;}
  1729.     febePathName = ""
  1730.     if(!febePickFile("cookies*.json",35)){return true};            
  1731.     var check1 = febePrName.indexOf("cookies{");
  1732.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  1733.     if(check1 != 0 || check2 != 6){
  1734.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[71].replace("%FILE%","'"+febePrName+"'")+"\n";
  1735.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  1736.         febeAlert(tmp);
  1737.         return false;
  1738.     }//if
  1739.  
  1740.     febeGetBuDate(febePathName);
  1741.     if(febeConfirmRestore(39,febeBUdate)){
  1742.  
  1743.         Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager).removeAll();
  1744.         
  1745.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1746.  
  1747.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  1748.         var cookieSvc = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService);
  1749.  
  1750.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1751.         dFile.initWithPath(febePathName);
  1752.         
  1753.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  1754.         fis.init(dFile, 0x01, 0444, 0);
  1755.         fis.QueryInterface(Ci.nsILineInputStream);
  1756.  
  1757.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  1758.         cis.init(fis,"UTF-8", 0, 0x0000);
  1759.         
  1760.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  1761.  
  1762.         // read lines into array and parse into individual fields
  1763.         var line = {}, hasmore;    
  1764.         var cnt = 0;
  1765.         do {
  1766.             hasmore = lis.readLine(line);
  1767.             var cookie = JSON.decode(line.value)
  1768.             var url = "http" + ((cookie.isSecure)?"s":"") + "://" + cookie.host + (cookie.path || "").replace(/^(?!\/)/, "/");
  1769.             var cookieUri = ios.newURI(url, null, null);
  1770.             var dt = new Date()
  1771.             dt.setTime(cookie.expires)
  1772.             var str = cookie.name+"="+cookie.value+";domain="+cookie.host+";expires="+dt.toUTCString();
  1773.             cookieSvc.setCookieString(cookieUri, null, str, null);
  1774.             //document.cookie = unescape(str);    // Commit the cookie
  1775.             cnt++;
  1776.         } while(hasmore);
  1777.         febeAlert(febeMsg[44]);
  1778.     }else{
  1779.         febeAlert(febeMsg[46]);
  1780.     }//if
  1781.     cis.close();
  1782.     fis.close();
  1783.     return true;
  1784. }//febeRestoreCookies()
  1785.  
  1786. function febeRestoreUserChrome(){
  1787.     if(!febeInitDir()){return false;}
  1788.     febePathName = ""
  1789.     var chromeDir = febeProfDir.clone();
  1790.     chromeDir.append("chrome");
  1791.     if(!febePickFile("userChrome*.fbu",78)){return true};
  1792.     var check1 = febePrName.indexOf("userChrome{");
  1793.     var check2 = febePrName.length - febePrName.lastIndexOf("}.fbu");
  1794.     if(check1 != 0 || check2 != 5){
  1795.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[83].replace("%FILE%","'"+febePrName+"'")+"\n";
  1796.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  1797.         febeAlert(tmp);
  1798.         return false;
  1799.     }//if
  1800.  
  1801.     febeGetBuDate(febePathName);
  1802.     if(febeConfirmRestore(68,febeBUdate)){
  1803.         var sourceDir = febePfParent;
  1804.         var destDir = chromeDir.path;
  1805.         var zipName = febePfName;
  1806.         febeUnzip(sourceDir,destDir,zipName);
  1807.         febeChmod(destDir);
  1808.         febeAlert(febeMsg[79]);
  1809.     }else{
  1810.         febeAlert(febeMsg[46]);
  1811.     }
  1812.     return true;
  1813. }//febeRestoreUserChrome()
  1814.  
  1815. function febeRestorePasswords(){
  1816.     if(!febeInitDir()){return false;}
  1817.     febePathName = ""
  1818.     if(!febePickFile("usernames-passwords*.json",80)){return true};    
  1819.     var check1 = febePrName.indexOf("usernames-passwords{");
  1820.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  1821.     if(check1 != 0 || check2 != 6){
  1822.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[125].replace("%FILE%","'"+febePrName+"'")+"\n";
  1823.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  1824.         febeAlert(tmp);
  1825.         return false;
  1826.     }//if
  1827.     
  1828.     febeGetBuDate(febePathName);
  1829.  
  1830.     if(febeConfirmRestore(70,febeBUdate)){
  1831.  
  1832.         // Clear existing paswords
  1833.         var hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField
  1834.         var loginManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
  1835.         var logins = loginManager.getAllLogins({}); 
  1836.         for (var i = 0; i < logins.length; i++) {
  1837.             //login = new nsLoginInfo(hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField);
  1838.             login = {};
  1839.             login.hostname = logins[i].hostname;
  1840.             login.formSubmitURL = logins[i].formSubmitURL;
  1841.             login.httpRealm = logins[i].httpRealm;
  1842.             login.username = logins[i].username;
  1843.             login.usernameField = logins[i].usernameField;
  1844.             login.password = logins[i].password; 
  1845.             login.passwordField = logins[i].passwordField;
  1846.             loginManager.removeLogin(login);
  1847.         }//for
  1848.         
  1849.         dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1850.         dFile.initWithPath(febePathName);
  1851.         
  1852.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  1853.         fis.init(dFile, 0x01, 0444, 0);
  1854.         fis.QueryInterface(Ci.nsILineInputStream);
  1855.  
  1856.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  1857.  
  1858.         cis.init(fis,"UTF-8", 0, 0x0000);
  1859.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  1860.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1861.         var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",Ci.nsILoginInfo,"init");
  1862.  
  1863.         var line = {}, hasmore;    
  1864.         var cnt = 0;
  1865.         do {
  1866.             hasmore = lis.readLine(line);
  1867.             var data = JSON.decode(line.value)
  1868.             login = new nsLoginInfo(hostname, formSubmitURL, httprealm, username, password, usernameField, passwordField);
  1869.             login.hostname = data.hostname;
  1870.             login.formSubmitURL = data.formSubmitURL;
  1871.             login.httpRealm = data.httpRealm;
  1872.             login.username = data.username;
  1873.             login.usernameField = data.usernameField;
  1874.             login.password = febeObfuscate(false,data.password);
  1875.             login.passwordField = data.passwordField;
  1876.             try{
  1877.                 loginManager.addLogin(login);
  1878.                 cnt++;
  1879.             }catch(e){
  1880.                 var err = e;
  1881.                 var tmp = "<style>color: red; font-weight: bold; font-size: 10px;</style>"+err+"\n";
  1882.                 tmp += "Host: "+login.hostname+"\n"
  1883.                 tmp += "Username: "+login.username+"\n\n";
  1884.                 tmp += "<style>color: black; font-weight: bold; font-size: 12px;</style>"
  1885.                 tmp += "Login entry skipped";
  1886.                 febeAlert(tmp);
  1887.             }
  1888.         } while(hasmore);
  1889.         febeAlert(febeMsg[81]);
  1890.     }else{
  1891.         febeAlert(febeMsg[46]);
  1892.     }//if
  1893.     cis.close();
  1894.     fis.close();
  1895.     return true;
  1896. }//febeRestorePasswords()
  1897.  
  1898. function febeRestoreSearchPlugins(){
  1899.     if(!febeInitDir()){return false;}
  1900.     febePathName = ""
  1901.     if(!febePickFile("searchPlugins*.fbu",84)){return true};
  1902.     var check1 = febePrName.indexOf("searchPlugins{");
  1903.     var check2 = febePrName.length - febePrName.lastIndexOf("}.fbu");
  1904.     if(check1 != 0 || check2 != 5){
  1905.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[55].replace("%FILE%","'"+febePrName+"'")+"\n";
  1906.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  1907.         febeAlert(tmp);
  1908.         return false;
  1909.     }//if
  1910.  
  1911.     febeGetBuDate(febePathName);
  1912.     if(febeConfirmRestore(72,febeBUdate)){
  1913.         var profileDir = febeProfDir.clone();
  1914.         profileDir.append("searchplugins");
  1915.         if (!(profileDir.exists() && profileDir.isDirectory())){
  1916.             // Create firedctory
  1917.             profileDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);
  1918.         }//if
  1919.         var zipFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1920.         zipFile.initWithPath(febePathName);
  1921.         
  1922.         var sourceDir = zipFile.parent.path;
  1923.         var destDir = profileDir.path;
  1924.         var zipName = zipFile.leafName
  1925.         febeUnzip(sourceDir,destDir,zipName);
  1926.         febeChmod(destDir);
  1927.         febeAlert(febeMsg[85]);
  1928.     }else{
  1929.         febeAlert(febeMsg[46]);
  1930.     }//if
  1931.     return true;
  1932. }//febeRestoreSearchPlugins()
  1933.  
  1934. function febeRestoreBrowserHistory(){
  1935.     if(!febeInitDir()){return false;}
  1936.     febePathName = ""
  1937.     if(!febePickFile("history*.json",86)){return true};
  1938.     var check1 = febePrName.indexOf("history{");
  1939.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  1940.     if(check1 != 0 || check2 != 6){
  1941.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[63].replace("%FILE%","'"+febePrName+"'")+"\n";
  1942.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  1943.         febeAlert(tmp);
  1944.         return false;
  1945.     }//if
  1946.  
  1947.     febeGetBuDate(febePathName);
  1948.     if(febeConfirmRestore(73,febeBUdate)){
  1949.         febeRestoreProgress();
  1950.         
  1951.         // Delete current history
  1952.         var bh = Cc["@mozilla.org/browser/nav-history-service;1"].getService(Ci.nsIBrowserHistory);
  1953.         bh.removeAllPages();
  1954.         try {
  1955.           var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
  1956.           os.notifyObservers(null, "browser:purge-session-history", "");
  1957.         }
  1958.         catch (e) { }
  1959.         
  1960.         // Clear last URL of the Open Web Location dialog
  1961.         var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch2);
  1962.         try {
  1963.           prefs.clearUserPref("general.open_location.last_url");
  1964.         }
  1965.         catch (e) { }
  1966.  
  1967.         // Restore browser history
  1968.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  1969.  
  1970.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  1971.         var cookieSvc = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService);
  1972.  
  1973.         var dFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  1974.         dFile.initWithPath(febePathName);
  1975.         
  1976.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  1977.         fis.init(dFile, 0x01, 0444, 0);
  1978.         fis.QueryInterface(Ci.nsILineInputStream);
  1979.  
  1980.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  1981.         cis.init(fis,"UTF-8", 0, 0x0000);
  1982.         
  1983.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  1984.  
  1985.         // read lines into array and parse into individual fields
  1986.         var line = {}, hasmore;    
  1987.         var cnt = 0;
  1988.         do {
  1989.             hasmore = lis.readLine(line);
  1990.             var histObj = JSON.decode(line.value);
  1991.             // create an nsIURI 
  1992.             var uri = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService).newURI(histObj.aURI, null, null);
  1993.  
  1994.             try{
  1995.                 bh.addPageWithDetails(uri, histObj.aTitle, histObj.aLastVisited) 
  1996.             }catch(e){
  1997.                 var msg = "\n\naURI: "+histObj.aURI+"\naTitle: "+histObj.aTitle+"\naLastVisited: "+histObj.aLastVisited;
  1998.                 febeFatal(e, msg)
  1999.                 return false;
  2000.             }//try/catch
  2001.             cnt++;
  2002.         } while(hasmore);
  2003.         febeWin.close();
  2004.         febeAlert(febeMsg[106]);
  2005.     }else{    
  2006.         febeWin.close();
  2007.         febeAlert(febeMsg[46]);
  2008.     }//if
  2009.     cis.close();
  2010.     fis.close();
  2011.     return true;
  2012. }//febeRestoreBrowserHistory()
  2013.  
  2014. function febeRestoreFormFillHistory(){
  2015.     if(!febeInitDir()){return false;}
  2016.     febePathName = ""
  2017.     if(!febePickFile("ffhistory*.json",88)){return true};
  2018.     var check1 = febePrName.indexOf("ffhistory{");
  2019.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  2020.     if(check1 != 0 || check2 != 6){
  2021.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[82].replace("%FILE%","'"+febePrName+"'")+"\n";
  2022.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2023.         febeAlert(tmp);
  2024.         return false;
  2025.     }//if
  2026.  
  2027.     febeGetBuDate(febePathName);
  2028.     if(febeConfirmRestore(74,febeBUdate)){
  2029.         // Get database file in profile folder
  2030.         var dbFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  2031.         dbFile.append("formhistory.sqlite"); 
  2032.  
  2033.         var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  2034.         var db = storageService.openDatabase(dbFile);
  2035.  
  2036.         var stmt;
  2037.         db.beginTransactionAs(db.TRANSACTION_DEFERRED);
  2038.         // Delete the existing table
  2039.         stmt = db.createStatement("DELETE FROM `moz_formhistory`");
  2040.         stmt.execute();
  2041.  
  2042.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2043.         var inFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2044.         inFile.initWithPath(febePathName);
  2045.         
  2046.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2047.         fis.init(inFile, 0x01, 0444, 0);
  2048.         fis.QueryInterface(Ci.nsILineInputStream);
  2049.  
  2050.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2051.         cis.init(fis,"UTF-8", 0, 0x0000);
  2052.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2053.     
  2054.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2055.  
  2056.         // Read the backup file
  2057.         var line = {}, hasmore;    
  2058.         var cnt = 0;
  2059.         do {
  2060.             hasmore = lis.readLine(line);
  2061.             obj = JSON.decode(line.value);
  2062.             var sQuery = "INSERT INTO moz_formhistory VALUES ('"+febeEscape(obj.id)+"','"+febeEscape(obj.fieldname)+"','"+febeEscape(obj.value)+"')"
  2063.             stmt = db.createStatement(sQuery);
  2064.             stmt.execute();
  2065.             cnt++;
  2066.         } while(hasmore);
  2067.         db.commitTransaction();
  2068.  
  2069.         febeAlert(febeMsg[89]);
  2070.     }else{
  2071.         febeAlert(febeMsg[46]);
  2072.     }
  2073.     return true;
  2074. }//febeRestoreFormFillHistory()
  2075.  
  2076. function febeRestorePermissions(){
  2077.     if(!febeInitDir()){return false;}
  2078.     febePathName = ""
  2079.     if(!febePickFile("permissions*.json",117)){return true};
  2080.     var check1 = febePrName.indexOf("permissions{");
  2081.     var check2 = febePrName.length - febePrName.lastIndexOf("}.json");
  2082.     if(check1 != 0 || check2 != 6){
  2083.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[96].replace("%FILE%","'"+febePrName+"'")+"\n";
  2084.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2085.         febeAlert(tmp);
  2086.         return false;
  2087.     }//if
  2088.  
  2089.     febeGetBuDate(febePathName);
  2090.     if(febeConfirmRestore(118,febeBUdate)){
  2091.         // Get database file in profile folder
  2092.         var dbFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("ProfD", Ci.nsIFile);
  2093.         dbFile.append("permissions.sqlite"); 
  2094.  
  2095.         var storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  2096.         var db = storageService.openDatabase(dbFile);
  2097.  
  2098.         var stmt;
  2099.         // Delete the existing table
  2100.         stmt = db.createStatement("DROP TABLE `moz_hosts`");
  2101.         stmt.execute();
  2102.         // Create a new table
  2103.         stmt = db.createStatement("CREATE TABLE moz_hosts ( id INTEGER PRIMARY KEY,host TEXT,type TEXT,permission INTEGER)");
  2104.         stmt.execute();
  2105.         // Clean it up
  2106.         stmt = db.createStatement("VACUUM");
  2107.         stmt.execute(); 
  2108.  
  2109.         var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  2110.         var inFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2111.         inFile.initWithPath(febePathName);
  2112.         
  2113.         var fis = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  2114.         fis.init(inFile, 0x01, 0444, 0);
  2115.         fis.QueryInterface(Ci.nsILineInputStream);
  2116.  
  2117.         var cis = Cc["@mozilla.org/intl/converter-input-stream;1"].createInstance(Ci.nsIConverterInputStream);
  2118.         cis.init(fis,"UTF-8", 0, 0x0000);
  2119.         var lis = cis.QueryInterface(Ci.nsIUnicharLineInputStream);
  2120.     
  2121.         var JSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
  2122.  
  2123.         // Read the backup file
  2124.         var line = {}, hasmore;    
  2125.         var cnt = 0;
  2126.         db.beginTransactionAs(db.TRANSACTION_DEFERRED);
  2127.         do {
  2128.             hasmore = lis.readLine(line);
  2129.             obj = JSON.decode(line.value)
  2130.             stmt = db.createStatement("INSERT INTO moz_hosts VALUES ('"+obj.id+"','"+obj.host+"','"+obj.type+"','"+obj.permission+"')");
  2131.             stmt.execute();
  2132.             cnt++;
  2133.         } while(hasmore);
  2134.         db.commitTransaction();
  2135.  
  2136.         febeAlert(febeMsg[119]);
  2137.     }else{
  2138.         febeAlert(febeMsg[46]);
  2139.     }
  2140.     return true;
  2141. }//febeRestorePermissions()
  2142.  
  2143. function febeRestoreProfile(){
  2144.     if(!febeInitDir()){return false;}
  2145.     febePathName = "";
  2146.     var mask = "profileFx3{*}.fbu";
  2147.     if(febePlatform == 3) mask = "*.fbu";    // Bug 444423
  2148.     if(!febePickFile(mask,90)){return true};
  2149.     var check1 = febePrName.indexOf("profileFx3{");
  2150.     var check2 = febePrName.length - febePrName.lastIndexOf("}.fbu");
  2151.     if(check1 != 0 || check2 != 5){
  2152.         var tmp = "<style>color: purple; font-weight: bold; font-size: 12px;</style>"+febeMsg[103].replace("%FILE%","'"+febePrName+"'")+"\n";
  2153.         tmp += "<style>color: red; font-weight: bold; font-size: 14px;</style>"+febeMsg[46];
  2154.         febeAlert(tmp);
  2155.         return false;
  2156.     }//if
  2157.  
  2158.     
  2159.     var prefName = "extensions.febe.selectedRestoreProfile";
  2160.     febePrefs.setCharPref(prefName,febePathName);
  2161.     
  2162.     var prefName = "extensions.febe.selectedRestoreProfileName";
  2163.     febePrefs.setCharPref(prefName,febePrName);
  2164.  
  2165.     // Open restore profile window
  2166.     febeWin = window.openDialog("chrome://febe/content/febeProfile.xul", "FEBE", "chrome,modal,dialog=yes,alwaysRaised,centerscreen,resizable");    
  2167.     return true;
  2168. }//febeRestoreProfile()
  2169.  
  2170. function febeProfileWindowInit(){
  2171.     if(!febeInitDir()){return false;}
  2172.     febeWin = this.window.document;
  2173.  
  2174.     febeProfList = [];
  2175.     febeGetProfileList(febeProfList);
  2176.     
  2177.     febeWin.getElementById("febeCurrentProfileText").value = febeProfName ;
  2178.     
  2179.     var prefName = "extensions.febe.selectedRestoreProfile";
  2180.     var febePathName = febePrefs.getCharPref(prefName);  // Full path to backed up profile
  2181.     
  2182.     var prefName = "extensions.febe.selectedRestoreProfileName";
  2183.     var febePrName = febePrefs.getCharPref(prefName);
  2184.     febeWin.getElementById("febeSelectedProfileText").value = febePrName;
  2185.  
  2186.     for(var i = 0; i < febeProfList.length; i++){
  2187.         var item = febeWin.getElementById("febeProfileList")
  2188.             .insertItemAt ( i, febeProfList[i].Name , febeProfList[i].Path)
  2189.         if(item.label == febeProfName ){item.disabled = true;}
  2190.     }//for
  2191.  
  2192.     // If there is only one profile, display help message
  2193.     if(febeProfList.length == 1){
  2194.         var d = document.getElementById("febeRestoreID").value;
  2195.         febeHelp('99',d);
  2196.         return false;
  2197.     }//if
  2198.     return true;
  2199. }//febeProfileWindowInit()
  2200.  
  2201. function febeProfileSelected(pIndex){
  2202.     febeWin = this.window.document;
  2203.     if(!febeWin.getElementById("febeProfileList").selectedItem){  // Profile selected?
  2204.         febeAlert(febeMsg[48]);
  2205.         return false;
  2206.     }//if
  2207.     
  2208.     var item = febeWin.getElementById("febeProfileList").selectedItem.label;
  2209.     if(item == febeProfName ){
  2210.         febeAlert(febeMsg[6]);
  2211.         return false;
  2212.     }//if
  2213.     febeWin.getElementById("febeDestinationProfileText").value = item;
  2214.     var pIndex = febeWin.getElementById("febeProfileList").selectedIndex;
  2215.     return true;
  2216. }//febeProfileSelected()
  2217.  
  2218. function febeGetProfileList(febeProfList){
  2219.     // Create pointer to Firefox root directory (where the profile directories reside)
  2220.     var files = Cc["@mozilla.org/file/directory_service;1"]
  2221.         .getService(Ci.nsIProperties)
  2222.         .get("ProfD", Ci.nsIFile);// Was "DefProfRt"
  2223.     var parentDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2224.     parentDir.initWithPath(files.parent.path);
  2225.         
  2226.     var entries = parentDir.directoryEntries;
  2227.     while(entries.hasMoreElements()){
  2228.         var entry = entries.getNext();   
  2229.         entry.QueryInterface(Ci.nsILocalFile);
  2230.         if(!entry.isDirectory()){continue;}
  2231.         var p = new febeProfileObj;
  2232.         var x = entry.leafName;
  2233.         var P = x.indexOf(".");
  2234.         p.Name = x.substring(P+1);
  2235.         p.Path = entry.path;
  2236.         febeProfList.push(p);
  2237.     }//while
  2238.     return true;
  2239. }//febeGetProfileList()
  2240.  
  2241. function febeStartProfileRestore(){
  2242.     if(!febeInitDir()){return false;}
  2243.     febeWin = this.window.document;
  2244.     if(!febeProfileSelected()){return false};
  2245.     var progressbox = febeWin.getElementById("febeProfileRestoreBox");
  2246.     progressbox.hidden = false;
  2247.     
  2248.     var pIndex = febeWin.getElementById("febeProfileList").selectedIndex;
  2249.     var prefName = "extensions.febe.selectedRestoreProfile";
  2250.     febePathName = febePrefs.getCharPref(prefName);  // Full path to backed up profile
  2251.     febeGetBuDate(febePathName);
  2252.     if(febeConfirmRestore(75,febeBUdate)){
  2253.         if(!febeInitDir()){return false;}
  2254.         
  2255.         // Remove contents of destination profile
  2256.         var destProfile = febeProfList[pIndex].Path;
  2257.         pDestDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2258.         pDestDir.initWithPath(destProfile);
  2259.         var entries = pDestDir.directoryEntries;
  2260.         while(entries.hasMoreElements()){
  2261.             var entry = entries.getNext();   
  2262.             entry.QueryInterface(Ci.nsILocalFile);
  2263.             entry.remove(true);
  2264.         }//while
  2265.         
  2266.         var zipFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2267.         zipFile.initWithPath(febePathName);
  2268.         
  2269.         var sourceDir = zipFile.parent.path;
  2270.         var destDir = destProfile;
  2271.         var zipName = zipFile.leafName
  2272.         var OK = new Boolean(true);
  2273.         OK = febeUnzip(sourceDir,destDir,zipName);
  2274.         if(OK){
  2275.             febeChmod(destDir);            
  2276.             febeAlert(febeMsg[91]);
  2277.         }else{
  2278.             febeAlert(febeMsg[46]);
  2279.         }//if
  2280.     }else{
  2281.         febeAlert(febeMsg[46]);
  2282.     }//if
  2283.     return true;
  2284. }//febeStartProfileRestore()
  2285.  
  2286. function febeRestoreUDBU(index){
  2287.     var udbuLabel = febeUDBuList[index].Label;
  2288.     var udbuDescription = febeUDBuList[index].Description;
  2289.     var udbuType = parseInt(febeUDBuList[index].Type);
  2290.     var udbuPath = febeUDBuList[index].Path; 
  2291.     febePathName = ""
  2292.     if(!febeInitDir()){return false;}
  2293.     var fMask = udbuLabel.replace(/ /g,"?")+"*";
  2294.     if(udbuType == 1){fMask = udbuLabel.replace(/ /g,"?")+"*.fbu";}
  2295.     if(!febePickFile(fMask,161)){return false;};
  2296.     febeGetBuDate(febePathName);
  2297.     febeSetMsgs();
  2298.     febeMsg[163] = febeMsg[163].replace(/%fname%/,udbuDescription);
  2299.     febeMsg[164] = febeMsg[164].replace(/%fname%/,udbuDescription);
  2300.     if(udbuType == 0){
  2301.       // File restore is a straight copy
  2302.         if(febeConfirmRestore(163,febeBUdate)){
  2303.             febeCopyFile(febePathName,febeParent(udbuPath),febeLeafname(udbuPath));
  2304.             febeAlert(febeMsg[164]);
  2305.         }else{
  2306.             febeAlert(febeMsg[46]);
  2307.         }//if
  2308.     }else{
  2309.       // Restore backed up folder
  2310.         if(febeConfirmRestore(163,febeBUdate)){
  2311.             var zipFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2312.             zipFile.initWithPath(udbuPath);
  2313.         
  2314.             var sourceDir = febePfParent;
  2315.             febeGetPrefs();
  2316.             var destDir = "";
  2317.             if(febePlatform == 1){destDir = udbuPath.substr(0,3)};    // e.g., "C:\\"
  2318.             if(febePlatform == 2){destDir = "/";}
  2319.             if(febePlatform == 3){destDir = "/";}
  2320.  
  2321.             var zipName = febePrName;
  2322.             var OK = new Boolean(true);
  2323.             OK = febeUnzip(sourceDir,destDir,zipName);
  2324.             //febeWin.close();
  2325.             if(OK){
  2326.                 febeChmod(destDir);
  2327.                 febeAlert(febeMsg[164].replace("%fname%",udbuLabel));
  2328.             }else{
  2329.                 febeAlert(febeMsg[46]);
  2330.             }//if
  2331.         }//if
  2332.     }//if
  2333.     return true;
  2334. }//febeRestoreUDBU()
  2335.  
  2336. function febeDirCopy2(sourceDir,batchFileName){
  2337. // Recursively copy individual files and sub-directories to a destination directory
  2338. // Very tricky code ... could be written better.  So little time, so much to do
  2339.     var tmp = "sourceDir: "+sourceDir;
  2340.     tmp += "\nfebeSubRootDir: "+febeSubRootDir;
  2341.     tmp += "\nfebeDestDir: "+febeDestDir.path;
  2342.  
  2343.     var aFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
  2344.     if (!aFile) return false;
  2345.  
  2346.     aFile.initWithPath(sourceDir);
  2347.     var entries = aFile.directoryEntries;
  2348.     
  2349.     while(entries.hasMoreElements()){
  2350.         var entry = entries.getNext();
  2351.         entry.QueryInterface(Ci.nsIFile);
  2352.         var src = entry.path;
  2353.         var p = src.indexOf(febeSubRootDir)
  2354.         if(p == -1){continue;}
  2355.         if(entry.isDirectory()){
  2356.             febeDirCopy2(src,batchFileName);
  2357.         }else{
  2358.             var parentPath = entry.parent.path;
  2359.             var dest = febeDestDir.path+"\\"+parentPath.substring(p);
  2360.             var re = "\\"+batchFileName+"";
  2361.             ;
  2362.             var file = entry.leafName;
  2363.             febeCopyFile(src,dest.replace(re,"\\"),file);
  2364.         }//if
  2365.     }//while
  2366.     return true;
  2367. }//febeDirCopy2()
  2368.  
  2369. // ------------------ End of Restore Functions ------------
  2370.  
  2371. //alert("febe.js loaded");